10

我开始了一个具有一些分层数据的新项目,并且我正在查看将数据存储在数据库中的所有选项。数据库中的分层数据:递归查询与封闭表与图数据库的比较

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

我发现很难决定这些选项。例如:鉴于我的RDBMS允许递归查询,使用闭包表还是有意义的,并且在可维护性和性能方面如何与图数据库解决方案进行比较?

任何意见/经验将不胜感激!

+1

这个封闭表的东西实际上是非常整齐。如果你有递归查询,但不必要,但仍然非常整齐。感谢您的关注。 –

回答

8

全封闭表是多余的,如果你可以使用递归查询:)

我认为这是更好的有,你必须比处理额外的IO(和磁盘空间,一旦找出一个复杂的递归查询)的一个单独的表和相关的触发器。

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

+0

谢谢,我想这可能是如此 – tospo

+1

感谢您的基准。 –

+0

普遍认同,尽管请参阅Bill Karwin的SQL反模式以获取关于何时您可能仍想使用替代邻接列表方法(其中parent_id是字段)的指南 – Joffer

2

闭合表的级别字段(“深度”)是多余的。它只需要一个递归查询来计算它。总结一下。