Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP/MYSQL中注释的最佳存储和检索实践_Php_Mysql_Comments - Fatal编程技术网

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
...
  • 项目列表-显示项目描述和附加到该项目的帖子数量。e、 g.
    选择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
  • 一个帖子页面,显示帖子,然后在下面显示评论。此页面需要两个查询。收集post信息的查询,只返回1个数据库行。然后是一个查询,收集贴在这篇文章上的每一条评论。例如,
    选择p.desc。。。从p中,p.pid=$pid LIMIT 1
    选择c.desc。。。来自注释c,其中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()之前检索所有这些必需的数据方法以所需的格式显示数据。

    我将通过两个查询完成此操作:一个查询获取特定项目的所有帖子,另一个查询获取特定项目的所有帖子的所有评论。一些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。