По ссылке
http://stackoverflow.com/questions/1619058/storing-directory-hierarchy-in-a-key-value-data-store хранить путь в строке советует какой-то дятел. В MongoDB путь надо засунуть в список, поставить на него индекс и получить быстрые и удобные операции по разворачиванию веток, поиску детей и родителей и т.д. У этого метода есть всего 2 минуса:
невозможно безопасно переместить ветку, нет пользовательской сортировки узлов (например, вы хотите, что одни пункты меню были выше других).
Хранения дерева (как дерева) в одном документе решает проблему с перемещением узлов.
Но добавляет другие:
1. нельзя просто получить узел по ID.
Только рекурсивный обход дерева в поисках узла. Если нужно развернуть ветку от корня до узла - все становится еще сложнее.
2. размер документа.
в MongoDB ограничение на размер документа в 4MB, в CouchDB больше (вуху!!), но парсить JSON в несколько мегабайт операция небыстрая. Решение есть - хранить только структуру дерева в одном документе.
Если хранить дерево так:
{
"_id": "tree",
"_rev": "3-cca3e6d9201d3f07784d8578edf7bb87",
"tree": {
"3": { "2": { }, "4": { "5": { } } },
"6": { }
}
}
нет пользовательской сортировки узлов.
здесь есть сортировка, но сложно развернуть ветку от корня до узла:
{
"_id": "tree",
"_rev": "3-cca3e6d9201d3f07784d8578edf7bb87",
"tree": [
{
"id": 1,
"childs": [
{
"id": 11,
"childs": []
},
{
"id": 12,
"childs": []
}
]
},
{
"id": 2,
"childs": []
}
]
}
Дерево можно хранить иначе - плоский словарь, ключ - ID документа:
{
1: {
'parent_id': None,
},
2: {
'parent_id': None,
},
11: {
'parent_id': 1,
},
12: {
'parent_id': 1,
}
}
или
{
1: {
'childs': [11, 12],
},
2: {
'childs': [],
},
11: {
'childs': [],
},
12: {
'childs': [],
}
}
или
{
1: {
'parent_id': None,
'childs': [11, 12],
},
2: {
'parent_id': None,
'childs': [],
},
11: {
'parent_id': 1,
'childs': [],
},
12: {
'parent_id': 1,
'childs': [],
}
}
Но и здесь проблемы: либо нет пользовательской сортировки, либо сложно узнать всех детей, либо сложно развернуть ветку от корня до узла, либо сложно отрисовать дерево в шаблоне.