我想象每个评论都会存储在一个评论表中,并包含一个parent_id,它将是另一个评论的外键。我的问题在于如何获取所有这些数据而不需要大量查询,然后如何有效地组织评论以符合其所属的顺序。有人有任何关于如何最好实现这一点的想法吗?
我通常使用父子系统进行工作。
例如,考虑以下内容:
表comment( commentID, pageID, userID, comment [, parentID] )
parentID是一个外键,指向同一表中的commentID,它是可选的(可以为NULL)。
要选择评论,请使用此方法来获取“根”评论:
SELECT * FROM comments WHERE pageID=:pageid AND parentID IS NULL
还有这个是给孩子的:
SELECT * FROM comments WHERE pageID=:pageid AND parentID=:parentid
我创建了一个小教程,解释了递归方法背后的基本概念。正如上面的人所说,递归函数不太可扩展,但插入要高效得多。
以下是链接:
http://www.evanpetersen.com/index.php/item/php-and-mysql-recursion.html
和
http://www.evanpetersen.com/index.php/item/php-mysql-revisited.html
我不得不实现递归评论。 我在嵌套模型中遇到了困难,让我解释一下:
假设您想要文章的评论。 我们称根评论为直接附加到此文章的评论。 我们称回复评论为对另一个评论的答案。
我注意到(不幸的是),我希望根评论按日期降序排列, 但我希望回复评论按日期升序排列!! 矛盾!
因此,嵌套模型并没有帮助我减少查询次数。
这是我的解决方案:
创建具有以下字段的评论表:
id
article_id
parent_id(可为空)
date_creation
email
whateverYouLike
sequence
depth
此实现的3个关键字段是parent_id、sequence和depth。 parent_id和depth有助于插入新节点。
Sequence是真正的关键字段,它是一种嵌套模型仿真。
每次插入新的根评论时,它是x的倍数。 我选择x=1000,这基本上意味着我最多可以有1000个嵌套评论(这是我发现的唯一缺点 对于此系统,但此限制可以轻松修改,现在对我的需求已足够)。
最近的根评论必须是具有最大序列号的评论。
现在回复评论:我们有两种情况:回复根评论或回复回复评论。
在这两种情况下,算法都是相同的: 使用父级序列号,检索一个以获取您的序列号。 然后,您必须更新在父级序列号下方且在基本序列号上方的序列号, 基本序列号是所涉及的根评论正下方的根评论的序列号。
我不希望你完全理解这一切,因为我不是一个很好的解释者, 但我希望它可以给你新的想法。 (至少对我来说比嵌套模型更有效=请求较少,这才是真正的目标)。
这只是一个建议,但由于我现在也面临同样的问题, 如何在评论表中添加一个序列字段(int)和一个深度字段,并在插入新评论时进行更新。
序列字段将用于对评论进行排序。 深度字段将指示评论的递归级别。
然后,难点就是在用户插入新评论时进行正确的更新。
我还不知道实现起来有多难, 但我相信一旦实现,我们将比基于嵌套模型的解决方案获得更好的性能提升。
我采取了简单的方法。
然后使用 post_id 获取所有评论,并在客户端上递归排序。 我不在乎是否有 1000 条评论。 这发生在内存中。
这是一个数据库调用,那就是昂贵的一部分。