#mongodb #database-design #tree
Вопрос:
Предположим, мне нужно хранить лес деревьев в Монго. Давайте рассмотрим, например, следующее дерево (на практике деревья намного больше).
.
├── a
│ └── a1
├── b
│ ├── b1
│ └── b2
└── c
Мне нужно будет добавлять/удалять/переименовывать узлы и извлекать узлы по родителю в исходном порядке, например
add "a/a1" to root
add "a/a2" to root
add "a/a3" to root
remove "a/a3" from root
rename "a/a2" to "a/a3" in root
Я хочу хранить узлы дерева в виде документов в коллекции nodes
. Каждый документ узла содержит name
, parentId
, и order
среди его «братьев и сестер».
{ _id:0, "name":".", "parentId":0, "order":0 }
{ _id:1, "name":"a", "parentId":0, "order":0 }
{ _id:2, "name":"a1", "parentId":1, "order":0 }
{ _id:3, "name":"b", "parentId":0, "order":1 }
{ _id:4, "name":"b1", "parentId":3, "order":0 }
{ _id:4, "name":"b2", "parentId":3, "order":1 }
{ _id:4, "name":"c", "parentId":0, "order":2 }
Имеет ли смысл эта схема ? Как бы вы его улучшили ? Не могли бы вы предложить альтернативу ?
Комментарии:
1. Интуитивно я буду хранить идентификаторы дочерних узлов в массиве родительских узлов, чтобы избежать повторения всей коллекции(даже с индексированием) для поиска списка дочерних узлов. Я сохраню поле ParentID, чтобы отследить родительский узел от дочернего узла; оставляя поле order, поскольку ваши варианты использования, похоже, не фокусируются на работе с братьями и сестрами.
2. Некоторые подробности по адресу: Древовидные структуры моделей с MongoDB.
3. @prasad_ Большое вам спасибо за ссылку !