数据库中的分层数据:递归查询与闭包表与图数据库

时间:2011-09-21 09:49:58

标签: postgresql rdbms hierarchical-data neo4j transitive-closure-table

我正在开始一个有一些分层数据的新项目,我正在查看目前存储在数据库中的所有选项。

我正在使用PostgreSQL,它允许递归查询。我还研究了关系数据库的设计模式,比如closure tables,我看了一下图形数据库解决方案,比如neo4j。

我发现很难在这些选项之间做出决定。例如:假设我的RDBMS允许递归查询,那么使用闭包表是否仍然有意义?在可维护性和性能方面,它与图数据库解决方案相比如何?

非常感谢任何意见/经验!

2 个答案:

答案 0 :(得分:10)

如果可以使用递归查询,则整个闭包表是多余的:)

我认为拥有一个复杂的递归查询要比一个单独的表和相关触发器的额外IO(和磁盘空间)处理要好一些,这要好得多。

我在postgres中使用递归查询做了一些简单的测试。表中有几百万行查询仍然是<返回特定孩子的所有父母的10ms。返回所有孩子的速度也很快,具体取决于父母的水平。它似乎更依赖于磁盘IO获取行而不是查询速度本身。这是单用户完成的,因此不确定它在负载下的执行情况。我怀疑如果你还可以将大部分表保存在内存中(并正确设置postgres),它会非常快。按父ID对表进行聚类似乎也有帮助。

答案 1 :(得分:2)

闭包表的level-field(“depth”)是多余的。它只需要一个递归查询来计算它。这总结了它。