Я хочу реализовать структуру таксономии (гео термины) для моего приложения node.js с базой данных NoSQL. У меня была аналогичная структура таксономии с MySQL, но мне пора двигаться вперед и узнать что-то новое, поэтому я решил попробовать другой подход и использовать NoSQL (ориентированный на документ) для своего тестового приложения. Структура таксономии проста - существует пять разных уровней: страна (т.е. Великобритания) → регион (Англия) → уезд (Мерсисайд) → город/населенный пункт (Ливерпуль) → часть города (Токстет).
Очевидным выбором является использование древовидной структуры, но дьявол находится в деталях - исторически некоторые города и города принадлежали другим округам. Идея заключалась в том, чтобы пометить лиц, родившихся в определенных городах или городах с этими условиями, и отфильтровать их позже гео-тегами, поэтому я должен уважать тот факт, что Ливерпуль или Манчестер (в том числе) были частью Ланкашира в то время, когда родились некоторые люди, В противном случае результат, полученный любым пользователем с моим геофильтром, будет неправильным.
Пример: Джон Доу родился в Блэкберне (Ланкашир) еще в 1957 году. Пол Браун родился в 1960 году в Ливерпуле (Ланкашир, теперь Мерсисайд). Джорджия Доу (урожденная Джонс) родилась в Виррале (Чешир, теперь Мерсисайд) 5 лет спустя. Их сын Ринго родился в Ливерпуле (Мерсисайд к тому времени) в 1982 году.
Джон - Ланкастриан по происхождению, Пол - Ланкастриан и Мерсисидер, Грузия из Чешира и Мерсисайд в то же время, Ринго из Мерсисайд. Поэтому их следует классифицировать, когда я ищу по округу. Но с простой структурой "один ко многим", которая следует за современной структурой страны, они никогда не будут отфильтрованы, как и должно быть.
Как реализовать коллекцию с учетом сложности ее структуры с помощью NoSQL (в первую очередь, для документирования) решений? Я просмотрел его и сделал несколько исследований по стеке *, но до сих пор не знал, что делать дальше. На мой взгляд, есть несколько возможных путей решения этой проблемы:
-
Используйте SQL-подобную структуру данных:
{ {'name': 'United Kingdom', 'unique_id': 1}, {'name': 'England', 'unique_id': 2, 'parents': [1]}, {'name': 'Merseyside', 'unique_id': 3, 'parents': [2]}, {'name': 'Lancashire', 'unique_id': 4, 'parents': [2]}, {'name': 'Liverpool', 'unique_id': 5, 'parents': [3, 4]}, }
-
Используйте древовидную структуру с некоторыми ссылками:
{ {'name': 'United Kingdom', 'unique_id': 1 {'name': 'England', 'unique_id': 2] {'name': 'Merseyside', 'unique_id': 3] {'name': 'Liverpool', 'unique_id': 5, 'alternate_parents': [4]}, }, {'name': 'Lancashire', 'unique_id': 4}, }, }, }
-
Используйте древовидную структуру без ссылок (один-ко-многим) и добавьте тег "альтернативный родительский" в документ вручную:
{ {'name': 'United Kingdom', 'unique_id': 1 {'name': 'England', 'unique_id': 2] {'name': 'Merseyside', 'unique_id': 3] {'name': 'Liverpool', 'unique_id': 5}, }, {'name': 'Lancashire', 'unique_id': 4}, }, }, }
-
Придерживайтесь SQL.
- Попробуйте реализовать таксономию без базы данных.
Дайте мне совет по этому поводу, пожалуйста. Я новичок с любым NoSQL (в настоящее время я не создавал таких баз данных), поэтому для меня существует реальная проблема дизайна.
И я новичок в стеке *, поэтому не стесняйтесь исправить меня, если я сделал что-то не так с этим сообщением:) Спасибо!
ИЗМЕНИТЬ Я выбрал @Jonathan ответ как решение. Я думаю, что это лучше подходит для моих нужд (в моей базе данных будут храниться другие документы и помечать их этими терминами), особенно с помощью функции mapReduce, предложенной @Valentyn.
Но если для вашего приложения нет необходимых коллекций документов, то возможно наилучшее возможное решение для базы данных графов (на основе отношений, а не документов), предложенной @Philipp.