【问题标题】:Efficient Database Structure for Deep Tree Data深度树数据的高效数据库结构
【发布时间】: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


【解决方案1】:

我过去对任意​​深度的树所做的只是为每个树存储一个父键,以及一个控制父级下子级顺序的序列号。我使用了 RDBM,这非常有效。在阅读所需代码后安排树结构以正确安排事物 - 将每个节点放在节点父节点的子集合中 - 但实际上这运行得非常快。

这是一种非常幼稚的方法,因为它没有什么聪明之处,但它确实对我有用。

这棵树总共有大约 300 或 400 个成员,我认为有 7 或 8 层深。系统的这一部分完全没有性能问题:它非常快。 UI 是另一回事,但这是另一回事。

【讨论】:

  • 我可能弄错了,但这不是一个非常小的数据库吗? 8 层深度的 400 名成员很小,不是吗?我的问题不是找到一个功能性的解决方案,而是找到一个非常有效的解决方案。我有十亿“会员”,除非我误解了您对“会员”的定义?
  • 好吧,你确实说过 Q 中有十亿成员。但这并不是理所当然的事情(SO 上的人会说各种各样的事情)。你需要让它更可信——比如“来自某某的十亿数据点”。否则人们可能会认为您正在构建新的 Facebook(他们似乎都在构建“社交网站”),而且很可能它永远不会看到比他们的家人更多的东西。所以道歉;这个答案不合适。
  • PS 我猜你已经看过了,但是维基百科文章en.wikipedia.org/wiki/Graph_(data_structure)#Representations 有一些替代方案。
  • 它不适合 Facebook,但它是一个相当大的重大项目。在这里为如此庞大的系统发布问题可能有点奇怪,因为显然有很多专业知识和知识,以及在这样一个系统上工作的工程师。但我是带头人,我对整体架构问题感到不安。我很快将与主要的开发团队会面,他们将试图向我推销他们的数据库解决方案。我不想在没有完成作业的情况下参加那些会议。所以这个问题是基于迄今为止对该主题的研究。希望有帮助。 :-)
  • 我还应该提到我的问题背后有更多的知识。我正在寻找对我的想法的健全性检查。例如,我相信 NoSQL 解决方案,尤其是 Cassandra 数据库,可能允许我不必在我的业务逻辑中处理的散列和布隆过滤器方法。 Cassandra 还解决了我对水平扩展和冗余的需求。我将与他们的数据库专家会面,并用我的发现更新这个问题。
猜你喜欢
  • 2016-09-13
  • 2012-03-05
  • 1970-01-01
  • 1970-01-01
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 2013-03-09
  • 1970-01-01
相关资源
最近更新 更多