Php 嵌套注释系统sql

Php 嵌套注释系统sql,php,mysql,sql,Php,Mysql,Sql,我有一个我设计的评论系统,它没有任何嵌套。现在我想让人们直接回复评论,而不是页面上的一般内容。因此,我考虑在数据库中添加一个指向父id的父id列 现在是下一步(我现在面临的问题是如何找到一个好的方法)。查询数据库中的所有注释(嵌套注释和非嵌套注释),所有注释都基于它们的通用“thing id”,然后按正确的顺序显示,这样嵌套的注释就可以正确地连接到它们的父注释…有没有有效的方法将所有这些注释排序在一起,这样我就不必开始使用递归之类的东西进行奇怪的查询调用?所有的评论都有一个时间戳和一些其他无关的

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

现在是下一步(我现在面临的问题是如何找到一个好的方法)。查询数据库中的所有注释(嵌套注释和非嵌套注释),所有注释都基于它们的通用“thing id”,然后按正确的顺序显示,这样嵌套的注释就可以正确地连接到它们的父注释…有没有有效的方法将所有这些注释排序在一起,这样我就不必开始使用递归之类的东西进行奇怪的查询调用?所有的评论都有一个时间戳和一些其他无关的数据

谢谢你的建议

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

当您对特定项目进行查询时,将查找具有匹配项目ID的每个项目,其集合在项目集合中。检索所有子项及其所有子项,依此类推。按开始或结束对它们进行排序,注释甚至应该按顺序出现——您可以与另一个端点进行比较,以判断其中一个端点是否是另一个端点的子项。(如果已按开始排序,且此项的结束时间小于前一项的结束时间,则有一个子项。)

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

  • 对于该文章,通过向其添加2来更新每个'end'>=8
  • 对于那篇文章,通过添加2来更新每个'start'>8
  • 插入新项目,并附上一组(8,9)
当然,在你插入的评论之后,你的评论越多,更新的速度就越慢

等等…让我谷歌一下

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

当您对特定项目进行查询时,将查找具有匹配项目ID的每个项目,其集合在项目集合中。检索所有子项及其所有子项,依此类推。按开始或结束对它们进行排序,注释甚至应该按顺序出现——您可以与另一个端点进行比较,以判断其中一个端点是否是另一个端点的子项。(如果已按开始排序,且此项的结束时间小于前一项的结束时间,则有一个子项。)

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

  • 对于该文章,通过向其添加2来更新每个'end'>=8
  • 对于那篇文章,通过添加2来更新每个'start'>8
  • 插入新项目,并附上一组(8,9)
当然,在你插入的评论之后,你的评论越多,更新的速度就越慢

等等…让我谷歌一下


最简单的方法是使用两个查询。第一个查询选择所有父项,第二个查询选择它们的子项。或者一次将它们全部选中,然后将它们放入一个数组中,并以parent_id作为键。我知道这可能不是一个实用的选项,但仍然需要考虑:这似乎是一个很好的应用程序用例。您可以在帖子中存储帖子的所有注释,然后在该注释中的每个注释上嵌套注释。查询一些帖子的所有数据就像抓取文档一样简单,不需要任何连接!但是,您的其他设计可能无法与MongoDB配合使用。但是,就像我说的,这是一件有趣的事情,如果嵌套可以是任何层次的深度,那么你可能无法避免某种递归。如果你更熟悉PHP,你可以在从MySQL获得的数组上递归。请使用搜索。对于这个理论,一些奇妙的答案已经存在于这个网站上,甚至还有一些代码示例。反复回答这个问题太复杂、太麻烦了。最简单的方法是使用两个查询。第一个查询选择所有父项,第二个查询选择它们的子项。或者一次将它们全部选中,然后将它们放入一个数组中,并以parent_id作为键。我知道这可能不是一个实用的选项,但仍然需要考虑:这似乎是一个很好的应用程序用例。您可以在帖子中存储帖子的所有注释,然后在该注释中的每个注释上嵌套注释。查询一些帖子的所有数据就像抓取文档一样简单,不需要任何连接!但是,您的其他设计可能无法与MongoDB配合使用。但是,就像我说的,这是一件有趣的事情,如果嵌套可以是任何层次的深度,那么你可能无法避免某种递归。如果你更熟悉PHP,你可以在从MySQL获得的数组上递归。请使用搜索。对于这个理论,一些奇妙的答案已经存在于这个网站上,甚至还有一些代码示例。这太复杂和繁重了,无法一次又一次地回答。
                                   Article
                             /-----(1, 12)----\
                       Comment                 Comment
                   /---(2, 5)               /--(6, 11)--\
             Comment                    Comment        Comment
             (3, 4)                     (7, 8)         (9, 10)