Рекомендации с иерархическими данными по нереляционным базам данных?
Я разрабатываю веб-приложение, которое использует нереляционную базу данных в качестве бэкэнда (django-nonrel + AppEngine). Мне нужно хранить некоторые иерархические данные (projects/subproject_1/subproject_N/tasks), и мне интересно, какой шаблон следует использовать. Пока я думал о:
- Список смежности (сохранить идентификатор родительского элемента)
- Вложенные наборы (сохраните левые и правые значения для элемента)
В моем случае глубина вложения для обычного пользователя не будет превышать 4-5 уровней. Кроме того, в пользовательском интерфейсе я хотел бы иметь нумерацию элементов для первого уровня, чтобы избежать загрузки слишком большого количества элементов при загрузке первой страницы.
Насколько я понимаю, вложенные множества хороши, когда иерархия больше используется для отображения. Списки смежности хороши, когда редактирование на дереве выполняется часто. В моем случае, мне кажется, мне нужно больше, чем редактирование (при использовании вложенных наборов, даже если отображение будет работать отлично, приведенная выше нумерация страниц может усложнить редактирование).
Есть ли у вас какие-либо мысли и советы, основанные на вашем опыте работы с нереляционными базами данных?
2 ответа
Как вы храните их, зависит от того, как вам нужно их запросить. Например, если вам нужно только найти прямых потомков родителя, модель списка смежности, вероятно, является самой простой. Если вы хотите перечислить целые поддеревья, список предков или вложенные наборы работают хорошо, хотя я бы избегал вложенных наборов в App Engine.
Если вам нужна целостность транзакций для всех объектов в дереве - и вы не будете обновлять дерево в целом чаще, чем несколько раз в секунду - вам следует обратиться к поддержке App Engine для групп сущностей и предков.
Я использовал SQL Server для размещения нереляционных данных. В SQL Server есть такие вещи, которые называются ierarchyID.., которые делают большую часть этого прозрачным.
Какая именно у вас проблема?