RavenDB моделирование данных
Недавно я начал изучать RavenDB и пытался понять, подходит ли он для некоторых наших проектов. Однако я столкнулся с некоторыми вопросами относительно "правильного" способа моделирования простой структуры данных. Я постараюсь описать это:
- Есть 3 типа объектов: руководства, категории и ссылки
- "Корневое" руководство может содержать 0 или более подгузников
- Руководство может содержать 0 или более категорий
- Категория может содержать 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?
РЕДАКТИРОВАТЬ (добавлены основные запросы)
Доступ к данным довольно прост. У меня есть следующие требования:
- Выберите список корневых направляющих со всеми дополнительными направляющими.
- Для конкретного руководства (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")
Это даст вам руководство со всеми его подразделами.