什么是将目录层次结构/树存储在键值数据库中的干净/有效方法(在我的情况下是MongoDB但是其中任何一个)?
例如树结构
- Cars + Audi + BMW - M5 + Ford - Color + Red - Apple - Cherry + Purple - Funny
我现在使用的方法,每个对象链接到它的父级
{ dir: "red" parent-dir: "color" }
这使得插入和重新排序树的任何方面非常有效/快速(例如,如果我想将Red及其所有子项移动到Cars目录中).
但是当我想要递归地给定目录的所有子目录及其子节点时,这种方法很糟糕.为了使解析有效,我可以有一个结构
{ dir: "red" children: "audi, bmw, ford" } { dir: "bmw" children: "m5" }
但是如果我想修改树,需要触摸和修改一大堆对象.
是否有其他方法可以在KV存储中存储目录结构?
您当前使用的方法称为邻接列表模型.
在(关系)数据库中存储分层数据的另一种模型是嵌套集模型.它在SQL数据库中的实现是众所周知的.另请参阅本文以了解修改后的预订树遍历算法.
一个非常简单的方法:您可以存储每个对象的路径 - 在NOSQL数据库中查询树应该很容易:
{ path: "Color", ... } { path: "Color.Red", ... } { path: "Color.Red.Apple", ... } { path: "Color.Red.Cherry", ... }
当删除或重命名节点时,必须更新某些路径.但总的来说,这种方法看起来很有希望.您只需要保留一个特殊字符作为分隔符.存储空间开销应该可以忽略不计.
编辑:此方法称为物化路径
最后,这里是NOSQL数据库中分层数据的不同方法的比较.