在我的数据库和查询设计方面,我遇到了一些问题。这是我想要的(老实说,很像堆栈溢出)。:
表结构如下:
Items
-----
iid
desc
...
Posts
-----
pid
iid
uid
date
desc
...
Comments
-----
cid
pid
uid
date
desc
...
所有这一切的逻辑是:获取项目的所有帖子 - >对于每个帖子,获取所有评论。 最好是在一个查询中完成所有操作吗?最好是进行一次查询以获取所有帖子,然后针对每个帖子的每组评论单独查询?
如果我做一个查询,那么我可能会有一个100行的庞然大物,我会有大量的重复数据。如果我为每个帖子单独调用,那么我将会有太多查询。书于?
答案 0 :(得分:2)
我想你的系统将有3个不同的视图,我会按如下方式构建它:
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
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
SELECT p.desc, ... FROM posts p WHERE p.pid = $pid LIMIT 1
和SELECT 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(数据访问对象)中,它在调用display()方法之前检索所有这些必需的数据,以便以你想要的格式显示数据。
答案 1 :(得分:0)
我会在两个查询中执行此操作:一个查询用于获取特定项目的所有帖子,另一个查询用于获取特定项目的所有帖子的所有评论。一些ActiveRecord实现也是如此。
答案 2 :(得分:0)
分配自动ID以发布和评论以及项目和检索帖子和评论属于该项目ID将是最好的,我想。