Как хранить дерево в Монго?

#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_ Большое вам спасибо за ссылку !