嵌套注释系统sql

时间:2012-08-16 06:13:15

标签: php mysql sql

我有一个我设计的评论系统,它的工作没有任何嵌套。现在我想让人们直接回复评论,而不是那个页面上的一般内容。所以我想在我的数据库中添加一个指向父ID的父id列。

现在下一步(我正在寻找一个很好的方法来解决这个问题)。是查询数据库中的所有注释(嵌套而不是)所有注释都基于它们的常用“事物id”然后以正确的顺序显示它们,以便嵌套的注释正确连接到它们的父项...是否有任何有效的方法一起订购所有这些评论,以便我不必开始使用递归和东西进行奇怪的查询调用?所有评论还有一个时间戳以及一些其他不相关的数据。

感谢您的任何建议

1 个答案:

答案 0 :(得分:3)

有一个名为“嵌套集”的概念。基本上,每个评论和文章都有两列,指定其子项集的“开始”和“结束”。每个评论都有一个完全在父项集合中的开始和结束,并且兄弟姐妹之间没有重叠 - 两个集合重叠的唯一时间是,当一个完全在另一个集合中时(即:如果一个项目是子项目)另一个)。

                                   Article
                             /-----(1, 12)----\
                       Comment                 Comment
                   /---(2, 5)               /--(6, 11)--\
             Comment                    Comment        Comment
             (3, 4)                     (7, 8)         (9, 10)

当您对特定商品进行查询时,您会查找具有匹配商品ID的每个商品,其商品ID位于商品的集合中。那将检索所有孩子和他们所有的孩子,等等。按开头或结尾对它们进行排序,注释甚至应该按顺序显示 - 您可以与另一个端点进行比较,以判断一个是否是另一个的子项。 (如果您按开始排序,并且此项目的结尾小于前一个项目,那么您有一个子项目。)

缺点是,每条评论都需要更新这些集合。这很简单,但可能很慢。为了在(7,8)下添加另一个项目,例如:

  • 对于那篇文章,通过向其添加2来更新每个'end'> = 8.
  • 对于那篇文章,请更新每个'start'> 8加2。
  • 使用一组(8,9)插入新项目。

您插入的评论之后的评论越多,当然,更新速度越慢。

坚持......聊聊谷歌...

http://en.wikipedia.org/wiki/Nested_set_model