2011-07-01 73 views
2

当我涉及到数据库和查询设计时,我遇到了一些问题。这是我想要的(老实说,很像堆栈溢出)。:PHP/MYSQL评论的最佳存储和检索实践

  • 一个项目有很多职位。
  • 一篇文章有​​很多评论。
  • 评论可以标记,喜欢和不喜欢。
  • 评论不能有子注释。

表结构如下:

Items 
----- 
iid 
desc 
... 

Posts 
----- 
pid 
iid 
uid 
date 
desc 
... 

Comments 
----- 
cid 
pid 
uid 
date 
desc 
... 

的逻辑这一切的是:获得项目的所有职位 - >对每个岗位,让所有意见。 最好是在一个查询中完成这一切吗?是否最好做一个查询来获取所有帖子,然后为每个帖子上的每组评论单独查询?

如果我做了一个查询,那么我可能会有一个100行的庞然大物,我会有大量重复的数据。如果我为每个帖子分别打电话,那么我会有太多的问题。书于?

回答

2

我想,你的系统将会有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. 帖子所选项目的列表 - 显示在其下方显示的讯息,接着评论岗位和每个岗位e.g 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。你可以在这里改变排序模仿计算器如何通过最古老的,票订单数据等

我会说这是可扩展的模型,我总是建议写瘦的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(数据访问对象)中,该函数在调用display()方法以所需格式显示数据之前检索所有这些所需的数据。

+0

我不确定我的描述是否足够好。 想象一下,该项目是堆栈上的开放问题。 每个“帖子”都是堆栈上的答案。 每个评论是对答案的评论。 因此,从技术上讲,所有这些信息都只有一个视图 - 就像本网站一样。 – makowb

+0

@makowb在这种情况下,Karolis对我的建议将是最好的方法,并结合查询来提取有关正在查看的项目的信息。 – GordyD

+0

@戈登,最后一个查询应该加入帖子表不是评论两次:) – Karolis

0

我会在两个查询中做到这一点:一个查询获取特定项目的所有帖子和其他查询以获取特定项目的所有帖子的所有评论。一些ActiveRecord实现工作是一样的。

+0

可以说我从帖子中获得了所有'pid'。我将如何存储这些用于第二个查询而不执行两次相同的查询? 例如,我可以使用存储过程并将所有pid存储在一个集合中并执行foreach循环。但是,这需要初始的“SELECT pid FROM posts WHERE pid = 1”执行两次。我假设这是我的最佳选择,但只是想确定。 – makowb

+0

@makowb不知道我理解你。您可以选择帖子中的所有信息(使用iid)并将其存储在数组或其他内容中。然后,您可以选择评论中的所有信息(加入张贴表和使用iid)并将其存储在数组中。稍后,您将循环并构建HTML。 – Karolis

0

指定自动识别码发布和评论,还有物品和检索帖子和评论属于该物品ID将是最好的,我想。

+0

你是说添加iid到评论表来做这种查找? – makowb

+0

是的,最好用id来做。 – jeni

+0

你的结构将会像这样,item id(主键)它将成为Post表的伪造关键字,Post id将成为注释表中的伪造关键字。所有三张桌子都会有自动增量的个人ID。 – jeni