13

您可能知道 PostgreSQL 有一个名为 ltree 的模块。此外,您还可以将 Array 类型用于整数(*1,请参见下面的评论),在此测试中,与 ltree 相比,它的递归查询实际上执行得稍慢 - 除了字符串索引(*2,请参阅下面的评论)。

不过,我不太确定这些测试结果的可信度。

我最大的问题实际上是关于相对未知且几乎没有文档的树模块。此处描述(也可以在其中找到文档!!)为:

对分层数据类型(某种词典树)的支持,应该转到 contrib/tree,由于缺乏适当的 文档而待定。

阅读完文档后,我有点困惑是否应该建立我的大型应用程序(一个 CMS,所有内容都将存储在分层树结构中 - 不仅是内容,还有文件等,所以你可以看到这会迅速扩大)围绕 ltree,普通的物化路径(路径枚举),以分隔的字符串或整数数组作为路径 - 或者如果理论上相对未知的“树”模块应该是两者的更快执行、更可扩展和更好的解决方案.

我已经分析了不同的树结构模型,并且由于节点和子树的查询性能、可伸缩性和重新排序是我的主要要求,我已经能够排除邻接列表(递归 CTE 无法解决性能问题,因为树的规模很大),嵌套集/间隔(在某些查询中速度不够快,考虑到它在操作树时的缺点),闭包表(在复杂树中非常大 - 对我这样的大型项目没有用处)等并决定使用物化路径,对于读取操作来说非常快,并且可以轻松地在层次结构中移动子树和节点。所以问题只是关于物化路径的最佳建议实现。

我特别好奇听到您在 PostgreSQL 中使用“树”的理论或经验。

4

1 回答 1

3

据我所知,contrib/tree 从未正式发布,而 ltree 已合并到 PostgreSQL 的核心中。

我知道两者都使用标记路径的相同想法,但树只允许整数标签,当 ltree 允许允许全文搜索的文本标签时,认为完整路径长度是有限的(最大 65Kb,首选 2Kb)。

于 2015-06-01T08:30:27.530 回答