我有一个项目,需要在 Ruby 中构建和存储大型数据树。我正在考虑对树进行序列化、反序列化和查询的不同方法,我想知道最好的方法是什么。我的主要限制是读取时间、查询效率和跨版本/跨平台兼容性。最常见的操作是根据 id/value 和/或 feature(s) 的组合检索节点集。树的深度可达 15-20 层。移动子树是一个不常见的过程,但应该可以在没有太多黑魔法的情况下实现。 Rails 集成不是主要问题。我考虑的选项以及我关心的一些问题如下:
- 编码树,并在需要时将它们加载到内存中并在 Ruby 中查询它们(随着树的增长效率低下,跨版本兼容性?)
- 同上,但使用 YAML(更多跨版本兼容,但效率较低?)
- 与上面相同,但使用自定义 XML 解析器(每次加载树时都需要从头开始重新创建对象吗?)
- 将树序列化为 XML,将它们存储在 XML 数据库(例如 Sedna)中并使用 XPath 查询树(没有使用此方法的经验,不确定效率?)
- 使用邻接表查询存储在无模式数据库中的树(计算后代时效率低下?)
- 使用物化路径(可能会超出深度树的最大字符串长度?)
- 使用嵌套集(复杂的 SQL 查询?)
- 使用array of ancestors方法?根据 MongoDB 页面,在查询效率方面似乎很有趣,但我没能找到任何关于此算法的认真讨论。
根据您的经验,哪种方法更符合我所描述的限制条件?如果我选择 XML 数据库,是否有更适合该项目的数据库?还有其他我忽略的方法会更有效吗?感谢您的宝贵时间。
最佳答案
树与图数据库(例如 neo4j)配合得很好:http://neo4j.org/learn/
Neo4j 是一个图数据库,存储图的节点和关系中的数据。作为最通用的数据结构,图可以优雅地表示任何类型的数据,同时保留域的自然结构。
Ruby 有一个很好的树接口(interface): https://github.com/andreasronge/neo4j
Pacer 是一个 JRuby 库,可以实现极具表现力的图形遍历。 Pacer 允许您使用非常快速且内存高效的流处理来创建、修改和遍历图形。这也意味着几乎所有处理都是在纯 Java 中完成的,所以当遇到通常的 Ruby 表现力与速度问题时,您可以吃蛋糕也可以吃,它非常快!
https://github.com/pangloss/pacer
Neography 就像 neo4j.rb gem,由 Ron 在评论中建议(感谢 Ron!)
关于sql - Ruby 中的树数据结构持久化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9560238/