【发布时间】:2012-03-05 00:27:19
【问题描述】:
我有一个项目需要在 Ruby 中构建和存储大型数据树。我正在考虑对树进行序列化、反序列化和查询的不同方法,我想知道最好的方法是什么。我的主要限制是读取时间、查询效率和跨版本/跨平台兼容性。最常见的操作是根据 id/value 和/或特征的组合检索节点集。树的深度可达 15-20 层。移动子树是一个不常见的过程,但应该可以在没有太多黑魔法的情况下实现。 Rails 集成不是主要问题。我考虑的选项以及我担心的一些问题如下:
- 编组树,并在需要时将它们加载到内存中并在 Ruby 中查询它们(随着树的增长效率低下,跨版本兼容性?)
- 与上述相同,但使用 YAML(跨版本兼容性更好,但效率较低?)
- 与上述相同,但使用自定义 XML 解析器(每次加载树时都需要从头重新创建对象?)
- 将树序列化为 XML,将它们存储在 XML 数据库(例如 Sedna)中并使用 XPath 来查询树(没有使用此方法的经验,不确定效率?)
- 使用邻接表查询存储在无模式数据库中的树(计算后代时效率低下?)
- 使用物化路径(可能会超出深度树的最大字符串长度?)
- 使用嵌套集(复杂的 SQL 查询?)
- 使用array of ancestors 方法?根据 MongoDB 页面,在查询效率方面似乎很有趣,但我还没有找到任何关于这个算法的严肃讨论。
根据您的经验,哪种方法更符合我所描述的限制条件?如果我选择 XML 数据库,是否有更适合这个项目的数据库?还有其他我忽略的更有效的方法吗?感谢您的宝贵时间。
【问题讨论】:
-
在我的工作中,我们将节点存储为记录,并将相关属性作为列属性和一个特殊的先前列引用父节点,或者如果没有,则为 null。如果结果集稀疏并且可以绑定最大可能的树深度,则可以使用几种 sql 方言、存储过程或自连接中可用的递归查询构造来组装子树。移动子树意味着更新给定值的先前列。到 xml reps 和 xpath 表达式的映射很简单。
-
这是否有 SQL 标记,因为您正在考虑将树存储在关系数据库中?
-
没错!你问是因为你有在关系数据库中存储树的经验吗? :)
-
我有在关系数据库中存储大量不同类型数据的经验。
标签: sql ruby serialization tree persistence