sql - Ruby 中的树数据结构持久化

标签 sql ruby serialization tree persistence

我有一个项目,需要在 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!)

https://github.com/maxdemarzi/neography

关于sql - Ruby 中的树数据结构持久化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9560238/

相关文章:

sql - 使用 SQL 查找订单数量超过 X 的客户总数

php - 如何知道SQL查询是否不返回任何行

ruby-on-rails - before_update 回调中的无限循环

ruby-on-rails - Ruby On Rails 中的编码与 ActiveRecord 序列化

如果阶段存在,则在里面进行 sql 查询

ruby - 如何在 Ruby 中从开始索引到最后选择字符串的一部分?

ruby - 尝试在 ruby​​ 中搜索字符串以获取输入

c# - 将难以形成的 XML 反序列化为 C# 对象

c# - 类似于 Json.Net 可以做的 XML 序列化

mysql - 优化sql请求统计