首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在键值数据存储中存储目录层次结构

在键值数据存储中存储目录层次结构
EN

Stack Overflow用户
提问于 2009-10-25 04:48:03
回答 4查看 14.2K关注 0票数 39

在键值数据库(在我的例子中是MongoDB )中存储目录层次结构/树的干净有效的方法是什么?

例如,树形结构

代码语言:javascript
复制
- Cars 
   + Audi 
   + BMW
      - M5
   + Ford
- Color
   + Red
      - Apple
      - Cherry
   + Purple
- Funny

我现在使用的方法是,每个对象都链接到它的父对象

代码语言:javascript
复制
{ 
  dir: "red"
  parent-dir: "color"
}

这使得插入和重新排序树的任何方面变得非常高效/快速(例如,如果我想要将Red及其所有子项移动到Cars目录)。

但是当我想要递归地访问给定目录的所有子目录及其子目录时,这种方法很糟糕。为了使解析更有效,我可以有一个结构,例如

代码语言:javascript
复制
{ 
  dir: "red"
  children: "audi, bmw, ford"
}

{ 
  dir: "bmw"
  children: "m5"
}

但是如果我想修改这棵树,就需要接触和修改一大堆对象。

是否有其他方法可以将目录结构存储在KV存储中?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-12-15 02:52:44

您现在使用的方法称为adjacency list model

在(关系)数据库中存储分层数据的另一个模型是nested set model。它的implementation in SQL databases is well known。另请参阅this article for the modified preorder tree traversal algorithm

一个非常简单的方法:您可以为每个对象存储一个路径-使用这些路径,可以很容易地在NOSQL数据库中查询树:

代码语言:javascript
复制
{ path: "Color", ... }
{ path: "Color.Red", ... }
{ path: "Color.Red.Apple", ... }
{ path: "Color.Red.Cherry", ... }

当要删除或重命名节点时,必须更新一些路径。但总的来说,这种方法看起来很有前途。您只需保留一个特殊字符作为分隔符。存储空间开销应该可以忽略不计。

edit:此方法称为

最后,这里是a comparison of different methods for hierarchical data in NOSQL databases

票数 60
EN

Stack Overflow用户

发布于 2009-11-03 01:27:19

我没有大量的NOSQL经验,所以这不是一个明确的答案,但以下是我如何处理它:

我可能会使用你的第一种方法,你有:

代码语言:javascript
复制
{
  dir: 'dir_name',
  parent_dir: 'parent_dir_name'
}

然后设置map-reduce来快速查询目录的子目录。MongoDB的map-reduce功能仍然只在开发分支中可用,我还没有使用过它,但是在CouchDB (我假设在MongoDB中做了一些修改)中,您可以执行如下操作:

代码语言:javascript
复制
map:
function(doc) {
  emit( doc.parent_dir, doc.dir );
}

reduce:
function(key, values) {
  return( values );
}

这将为您提供每个父目录的子目录列表。

票数 1
EN

Stack Overflow用户

发布于 2009-12-17 06:32:53

我建议将堆存储到数据项的id中。我认为这是最好的计划。如果你需要很多东西,任何heap元素都可以是另一个heap的索引。

例如

{ "id:xxx", "id:yyy", "sub-heap-id:zzz"....}

如果这一点不清楚,请发表评论,我回家后会解释更多。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1619058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档