PHP/MYSQL中注释的最佳存储和检索实践
在数据库和查询设计方面,我遇到了一些问题。下面是我想要的(老实说,非常像堆栈溢出):PHP/MYSQL中注释的最佳存储和检索实践,php,mysql,comments,Php,Mysql,Comments,在数据库和查询设计方面,我遇到了一些问题。下面是我想要的(老实说,非常像堆栈溢出): 一个项目有很多帖子 一篇帖子有很多评论 评论可以标记、喜欢和不喜欢 注释不能有子注释 表格结构如下: Items ----- iid desc ... Posts ----- pid iid uid date desc ... Comments ----- cid pid uid date desc ... 所有这些的逻辑是:获取项目的所有帖子->对于每个帖子,获取所有评论。 最好在一个查询中完成这一
- 一个项目有很多帖子李>
- 一篇帖子有很多评论李>
- 评论可以标记、喜欢和不喜欢
- 注释不能有子注释
Items
-----
iid
desc
...
Posts
-----
pid
iid
uid
date
desc
...
Comments
-----
cid
pid
uid
date
desc
...
所有这些的逻辑是:获取项目的所有帖子->对于每个帖子,获取所有评论。
最好在一个查询中完成这一切吗?最好是一次查询获取所有帖子,然后对每篇帖子上的每一组评论进行单独查询
如果我做一个查询,那么可能会有一个100行的庞然大物,其中会有大量重复数据。如果我为每个帖子单独打电话,那么我会有太多的疑问。Adivce?我想您的系统将有3个不同的视图,我将按如下方式构建它:
Items
-----
iid
desc
...
Posts
-----
pid
iid
uid
date
desc
...
Comments
-----
cid
pid
uid
date
desc
...
选择i.desc,…,从i离开的项目中计数(p.pid)加入i.iid上的p=p.iid组按i.iid顺序按i.date desc
SELECT p.desc,…,posts中的COUNT(c.cid)p LEFT JOIN comments c ON p.pid=c.pid,其中p.iid=$iid GROUP BY p.pid ORDER BY p.date desc
选择p.desc。。。从p中,p.pid=$pid LIMIT 1
和选择c.desc。。。来自注释c,其中c.pid=$pid ORDER BY c.date DESC
。您可以在这里更改排序,以模拟stackOverflow如何按最旧的、投票等对数据进行排序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(数据访问对象)中,该对象在调用display()之前检索所有这些必需的数据方法以所需的格式显示数据。我将通过两个查询完成此操作:一个查询获取特定项目的所有帖子,另一个查询获取特定项目的所有帖子的所有评论。一些ActiveRecord实现的工作原理是相同的。我认为,将自动id分配给post和comment以及项目,并检索属于该项目id的post和comment将是最好的 我不确定我的描述结构是否足够好。假设该项是堆栈上的开始问题。每个“帖子”都是堆栈上的答案。每个评论都是对答案的评论。因此,从技术上讲,所有这些信息只有一个视图-就像在这个网站上一样。@makowb在这种情况下,Karolis向我提出的建议是最好的方法,再加上一个查询,以获取有关所查看项目的信息。@Gordon,最后一个查询应该连接posts表而不是comments两次:)假设我从posts中获得了所有的“PID”。在不执行两次相同查询的情况下,如何存储这些数据以供在第二次查询中使用?例如,我可以使用一个存储过程,将所有PID存储在一个集合中,并执行foreach循环。但是,这将需要执行两次初始“从pid=1的帖子中选择pid”。我想这是我最好的选择,但我只是想确定一下。@makowb不确定我是否理解你。您可以从POST中选择所有信息(使用iid)并将其存储在数组或其他东西中。然后,您可以从comments(加入posts表并使用iid)中选择所有信息,并将其存储在一个数组中。稍后,您将执行循环并构造HTML。您的意思是将iid添加到注释表中,以便以这种方式进行查找?您的结构将如下所示,项目id(主键)它将是Post表中的forgein键,Post id将是注释表中的forgein键。所有三个表都有各自的自动递增id。