有一个概念叫做“嵌套集”。基本上,每条评论和文章都有两列,指定其子项集的“开始”和“结束”。每个评论都有一个完全在父项的集合内的开始和结束,并且兄弟之间没有重叠——两组重叠的唯一时间是当一个完全在另一个内时(即:如果一个项目是另一个)。
Article
/-----(1, 12)----\
Comment Comment
/---(2, 5) /--(6, 11)--\
Comment Comment Comment
(3, 4) (7, 8) (9, 10)
当您对特定项目进行查询时,您会查找具有匹配文章 ID 的每个项目,其集合在您的项目集合中。这会检索所有的孩子,以及他们所有的孩子,等等。按开始或结束对它们进行排序,评论甚至应该按顺序出现——您可以与另一个端点进行比较,以确定一个是否是另一个的子项。(如果你已经按开始排序,并且这个项目的结束小于前一个,那么你有一个子项目。)
缺点是,每条评论都需要更新这些集合。这很简单,但可能非常慢。为了在 (7,8) 下添加另一个项目,例如:
- 对于那篇文章,通过添加 2 来更新每个 'end' >= 8。
- 对于那篇文章,通过添加 2 来更新每个“开始”> 8。
- 插入带有一组 (8, 9) 的新项目。
当然,您插入的评论“之后”的评论越多,更新速度就越慢。
等等……让我谷歌……
http://en.wikipedia.org/wiki/Nested_set_model