【发布时间】:2014-01-24 05:40:20
【问题描述】:
对于一个非常大的数据数据库(超过十亿行),其中有一个非常深的数据树,最有效的结构是什么?读取加载是最高使用率,但树也会定期更改。
有几种标准算法可以表示数据树。我发现此参考作为 Mongodb 手册的一部分是一个很好的总结:http://docs.mongodb.org/manual/tutorial/model-tree-structures/
我的系统具有不能很好地映射到任何这些情况的属性。问题是树的深度非常大,以至于保留“祖先”或“路径”非常大。树的变化也足够频繁,以至于“嵌套集”方法效率不高。我正在考虑“物化路径”和“父引用”方法的混合,在该方法中,我存储的不是路径,而是一个不保证唯一的哈希,但 90% 的时间是。然后有 10% 的时间发生碰撞,父引用解决它。这个想法是 90% 的时间都有一个快速查询路径哈希。这个想法有点像布隆过滤器技术。但这都是背景:问题在这篇文章的第一行。
【问题讨论】:
-
您能否更准确地说一下“读取加载”的含义?
-
我的意思是查询与插入,我应该这么说。我的意思是数据库中有常规的插入,但大多数访问都是查询。重要的是这不是一棵静态树,插入可以发生在树中的任何位置,但 70% 的访问是用于查询。
-
什么样的查询?得到整棵树(从“木头”中取出)?获取给定节点的(直接)子节点?获取给定节点的(递归)后代?获取给定节点的(直接)父节点?获取给定节点的(所有)祖先?
-
所有这些情况。将其视为文件浏览器,其中每个“插入”代表文件元数据。 DB 实际上是从文件树到后端服务器场的映射。文件可以添加到“农场”但永远不会删除,但可以更新状态。这种结构的另一个术语是“全局命名空间”,您必须在其中查询整个或特定节点、子节点等。这有助于解释吗? - 更新:很少会查询整棵树,因为这样做的任何人都必须期待延迟。他们将文件放入特定的“目录”,即数据库中的一个节点。
-
简而言之,从用户角度考虑 Windows 资源管理器,单击“目录”,GUI 会显示文件和子目录。当您单击路径时,将在数据库中查询文件元数据。当您复制文件时,将查询数据库以获取告诉系统在哪里找到文件的数据。这不在我的问题范围内,为什么或这是为了什么,但我认为这些信息应该有所帮助。此文件树可能非常深。
标签: sql database-design tree hashmap bloom-filter