RavenDB моделирование данных

Недавно я начал изучать RavenDB и пытался понять, подходит ли он для некоторых наших проектов. Однако я столкнулся с некоторыми вопросами относительно "правильного" способа моделирования простой структуры данных. Я постараюсь описать это:

  • Есть 3 типа объектов: руководства, категории и ссылки
  • "Корневое" руководство может содержать 0 или более подгузников
  • Руководство может содержать 0 или более категорий
  • Категория может содержать 0 или более ссылок

Визуально структура будет:

  • корневые направляющие (0 или более)
    • Подвиды (0 или больше)
      • Категории (0 или больше)
        • Ссылки (0 или больше)
    • Категории (0 или больше)
      • Ссылки (0 или больше)

В фактических данных под каждым корневым руководством находится около 20 корневых руководств и около 3-5 под-руководств. Под каждым руководством (как корневым, так и подгидом) есть 15-25 категорий. И под каждой категорией есть от 5 до 20 ссылок.

Моя первоначальная мысль состояла в том, чтобы смоделировать это следующим образом (упрощенная модель):

Guide
---------------
Id
ParentGuideId
Title

Category
---------------
Id
GuideId
Title

Link
---------------
Id
CategoryId
Title

Это в значительной степени реляционная модель, и я понимаю, что это может быть неправильным способом моделирования данных в RavenDB. Так какая же альтернатива? Думаю, проблема в том, что я не хочу хранить Иерархию следующим образом:

Guide
---------------
Id
Title
SubGuides
Categories

SubGuide
---------------
Title
Categories

Category
---------------
Title
Links

Link
---------------
Title

Потому что это приведет к документам с потенциально тысячами подобъектов. Пожалуйста, имейте в виду, что модель выше упрощена. На самом деле данных по каждому типу гораздо больше, поэтому 20 документов корневого руководства в RavenDB были бы огромными, если бы мы использовали эту модель.

Есть ли альтернативы? Может быть, это мои годы плохого разговора о реляционном db-воспитании, но, может быть, этот сценарий просто не подходит RavenDB так же, как и SQL?

РЕДАКТИРОВАТЬ (добавлены основные запросы)

Доступ к данным довольно прост. У меня есть следующие требования:

  1. Выберите список корневых направляющих со всеми дополнительными направляющими.
  2. Для конкретного руководства (root или sub) получите все под-руководства (если root), категории и ссылки.

Это по сути все, что мне нужно. Тем не менее, одной из причин для оценки RavenDB или аналогичной, было добавление некоторых возможностей поиска. Как я уже упоминал, есть еще немного информации о ссылках, категориях и руководствах, таких как описание, теги и т. Д., Поэтому было бы неплохо иметь возможность поиска по всем этим.

1 ответ

Решение

Я бы справился с вещами так, чтобы Руководство было документом. Категории и ссылки встроены в этот документ.

Руководство может иметь коллекцию вспомогательных руководств.

Первый запрос состоит в том, чтобы запросить все руководства с их подводными лодками. Вы делаете это так:

session.Query<Guide>().Include(x=>x.SubGuides).Where(x=>x.Parent == null).ToList();

Это даст вам все в одном запросе к серверу.

session.Include<Guide>(x=>x.SubGuides).Load("guides/123")

Это даст вам руководство со всеми его подразделами.

Другие вопросы по тегам