【发布时间】:2010-10-10 20:57:47
【问题描述】:
我正在考虑在我的应用程序中使用 PostgreSQL 的 Ltree module 来帮助处理线程化 cmets。我一直在关注它用于螺纹 cmets。我认为它会在您需要更新节点及其子节点的情况下有所帮助,例如当您想要隐藏评论及其回复时。
我认为 ltree(或类似的东西)如果与传统的邻接列表(“comment_id”/“parent_comment_id”)结合使用会很有用。
在开始使用 ltree 之前,我想知道一些事情:
- 您是否或曾经使用过 ltree?这就是所谓的“生产就绪”吗?
- 如果是这样,您用它解决了哪些问题?做得好吗?
- 您认为它适合
线程评论系统?
- 如果你使用它,你在路径的“文本”部分使用了什么?您是否设置了类似于他们使用“Top.Astronomy.Cosmology”的 DMOZ 示例或基于主键“1.403.29.5”之类的东西?
- 有没有更好的方法来做到这一点?使用嵌套列表方法我有点紧张——我读过的所有内容都表明,UPDATES 或 INSERTS 并不是很热(你不必重新排序整个事情吗?)。我也不是 CS 专业的,这种数据结构是我将来可能会忘记的东西。有人在使用 cmets 或类似的嵌套列表吗?
如果有任何帮助,这是我正在考虑的架构:
CREATE TABLE comments (
comment_id SERIAL PRIMARY KEY,
parent_comment_id int REFERENCES comments(comment_id) ON UPDATE CASCADE ON DELETE CASCADE,
thread_id int NOT NULL REFERENCES threads(thread_id) ON UPDATE CASCADE ON DELETE CASCADE,
path ltree NOT NULL,
comment_body text NOT NULL,
hide boolean not null default false
);
ltree 使用的“路径”列如下所示:
<thread_id>.<parent_comment_id_#1>.<parent_comment_id_#2>.<my_comment_id>
在路径中使用主键有什么问题吗?我应该在路径中包含节点自己的主键吗?如果我这样做了,在其上放置唯一索引作为约束是否有意义?
【问题讨论】:
-
ltree 是一个“物化路径”实现。请参阅dbazine.com/oracle/or-articles/tropashko4 以比较可能的解决方案,包括更便携(但效率较低)的方法,例如嵌套集。
-
请随意添加这个作为答案。我对其他想法持开放态度。我研究过嵌套集合,但它们似乎很难实现,而且更新/插入速度相当慢(您不必将所有内容都向下移动吗?)。
-
哦,我正在考虑使用 ltree 除了邻接列表。因此“comment_id”和“parent_comment_id”。我的想法是使用 ltree 来加速分支上的操作
-
请记住,8.4 会将其中的一些功能引入核心(请参阅developer.postgresql.org/pgdocs/postgres/queries-with.html),因此如果您要修改现有代码,您可能希望推迟到 8.4 发布。
-
将此作为答案,对我来说听起来很像。我可能会推迟...我喜欢新的 postgresql 版本——我总是觉得自己像个糖果店里的孩子 :-)
标签: database postgresql tree comments hierarchy