PHP/MYSQL中注释的最佳存储和检索实践


Best storage and retrieval practices for comments in PHP/MYSQL

我在数据库和查询设计方面遇到了一些问题。以下是我想要的(老实说,很像堆栈溢出)

  • 一个项目有许多帖子
  • 一篇帖子有很多评论
  • 评论可以标记、点赞和不喜欢
  • 注释不能有子注释

表格结构如下:

Items
-----
iid
desc
...
Posts
-----
pid
iid
uid
date
desc
...
Comments
-----
cid
pid
uid
date
desc
...

所有这些的逻辑是:获取项目的所有帖子->对于每个帖子,获取所有评论。最好在一个查询中完成这一切吗?最好先进行一个查询以获得所有帖子,然后对每个帖子的每组评论进行单独的查询吗?

如果我做一个查询,那么我可能会有一个100行的庞然大物,其中会有大量重复数据。如果我为每个帖子单独打电话,那么我会有太多的疑问。Adivce?

我想你的系统将有3个不同的视图,我会将其结构如下:

  1. 项目列表-显示项目描述和附加到该项目的帖子数。例如SELECT i.desc, ...., COUNT(p.pid) FROM items i LEFT JOIN posts p ON i.iid = p.iid GROUP BY i.iid ORDER BY i.date DESC
  2. 所选项目的帖子列表-显示帖子和每条帖子的评论数量,例如SELECT p.desc, ...., COUNT(c.cid) FROM posts p LEFT JOIN comments c ON p.pid = c.pid WHERE p.iid = $iid GROUP BY p.pid ORDER BY p.date DESC
  3. 一个帖子页面,显示帖子,然后在下面评论。此页面需要两个查询。用于收集帖子信息的查询,只返回1个数据库行。然后是一个查询,收集附在这篇文章上的每一条评论。例如SELECT p.desc, ... FROM posts p WHERE p.pid = $pid LIMIT 1SELECT c.desc, ... FROM comments c WHERE c.pid = $pid ORDER BY c.date DESC。您可以更改此处的排序,以模拟stackOverflow如何按最旧的、投票等对数据进行排序

我认为这是一个可伸缩的模型,我总是建议编写精简的MySQL查询,只检索每个显示的实体所需的信息。

为了模仿这个页面,我会使用以下代码。。。

itemRs = mysql_query("SELECT i,iid, i.desc, ... FROM items i WHERE i.iid = $iid LIMIT 1");
// all posts relating to the item
postsRs = mysql_query("SELECT p.pid, p.desc, .... FROM posts p LEFT JOIN comments c ON p.pid = c.pid WHERE p.iid = $iid ORDER BY p.date DESC");
// all comments for all posts relating to the item
commentsRs = mysql_query("SELECT c.pid, c.cid, c.desc, .... FROM comments c INNER JOIN posts p ON p.pid = c.pid INNER JOIN items i ON p.iid = i.iid WHERE p.iid = $iid ORDER BY p.date DESC");

然后,您需要创建一个方法来显示这些数据。也许可以将所有这些功能封装到一个名为Item的DAO(数据访问对象)中,该DAO在调用display()方法以所需格式显示数据之前检索所有这些所需的数据。

我将在两个查询中完成这一操作:一个查询for获取特定项目的所有帖子,另一个查询用于获取特定项目所有帖子的所有评论。一些ActiveRecord实现的工作原理相同。

我认为,将自动id分配给帖子和评论以及项目,并检索属于该项目id的帖子和评论将是最好的。