Php SQL:在行中保留计数或从数据库中选择计数

Php SQL:在行中保留计数或从数据库中选择计数,php,mysql,Php,Mysql,示例:我有两张桌子 -类别 -帖子 这是一个很好的方法,以保持职位数量在类别像这样 SELECT c.id, c.title, count(p.id) FROM `categories` c INNER JOIN `posts` p ON c.id=p.category_id GROUP BY c.id 类别 id | title | posts ----+----------+-------- 1 | golf | 50 ----+-----

示例:我有两张桌子
-类别
-帖子

这是一个很好的方法,以保持职位数量在类别像这样

SELECT c.id,
       c.title,
       count(p.id)
FROM `categories` c
INNER JOIN `posts` p ON c.id=p.category_id
GROUP BY c.id
类别

 id |  title   | posts
----+----------+--------
 1  | golf     |  50
----+----------+-------
 2  | soccer   |  90
----+----------+-------
 id |  title   | category_id
----+----------+--------------
 1  | news 1   |  1
----+----------+--------------
 2  | news 2   |  2
----+----------+--------------
 3  | news 3   |  1
----+----------+--------------
帖子

 id |  title   | posts
----+----------+--------
 1  | golf     |  50
----+----------+-------
 2  | soccer   |  90
----+----------+-------
 id |  title   | category_id
----+----------+--------------
 1  | news 1   |  1
----+----------+--------------
 2  | news 2   |  2
----+----------+--------------
 3  | news 3   |  1
----+----------+--------------
或者我在这样的查询中使用select count()

SELECT c.id,
       c.title,
       count(p.id)
FROM `categories` c
INNER JOIN `posts` p ON c.id=p.category_id
GROUP BY c.id
但问题是,当我在类别表中保持计数时,当帖子更改类别时,我也必须更新类别表中的帖子字段。在小项目中没有问题,但对于大项目,什么是处理计数的好方法,因为我关心数据库性能


感谢所有的回答

我个人的偏好是,在证明有必要之前,不要在任何表格中保留重复的数据。如果您不喜欢编写
JOIN
查询,您可以定义一个包含该查询的视图,然后就可以忘记它了

我发现在过去,适当的索引通常意味着没有太多的性能问题


如果发现有必要保留一个计数摘要,则<代码>类别表(出于性能或其他原因),请考虑创建<代码> INSERT <代码>,

UPDATE
DELETE
在您的
posts
表上触发,这样更新就可以由数据库完成,而不是依赖应用程序程序员来记住必须做的事情。

丹博士的评论是正确的。
将帖子数量分类存储确实是一个好主意,但请记住,如果您这样做,“在插入新帖子或删除现有帖子时,您还必须具有递增和递减计数的触发器”,以保持完整性。

正如您正确指出的那样,您知道,如果单独存储计数,将导致维护问题

理想情况下,您应该动态地确定计数。有了适当的索引,这对大多数系统来说应该不是一个巨大的要求

然而,在某些情况下,预先计算的计数很有意义。考虑一个按年代顺序刷新其数据的系统。除了刷新活动外,没有其他内容将信息插入系统。这种系统非常适合预先计算的计数

具体地看你的问题,你似乎没有这个选择。这看起来相当“博客化”,因此,计数可能会一直变化


如果是我,我会开始动态计数路线,当动态成为问题时,我会进行预先计算的马匹交易。

这通常取决于您的用例

当然,从纯粹的角度来看,您不应该引入冗余,因此您提出的查询将是一条可行的道路。但是,您可能会遇到一些性能问题。

第二种方法是在posts表上有一个触发器,它在类别中维护posts计数器,但是如果posts表中有大量插入/删除,这也可能会影响性能

另一种方法是使用一些脏标志,如果设置了脏标志,将导致对categories表进行更新。


那么如何进行呢?首先,尝试一下纯粹而干净的方法,如果这会影响性能问题,分析你的使用情况并据此采取行动。

我想你必须在两个表之间使用
JOIN
,在大型项目中使用
groupby
,将计数存储在categories表中是个好主意如果读操作比写操作多,那么将计数存储在表中会更有益。这通常是一种折衷。有些人只是在每次操作performend(insert/delete)时更新这些summ表,以便数字保持准确,并保留一个日志表,记录每天执行的操作和夜间检查(jobs)以检查数字是否仍然准确。其他人只是在实时数据上使用count(),但正如您所说的,这将导致性能问题。我的目标是某种缓存。将当前类别计数存储在应用程序层中一段时间,并仅每15分钟更新一次。没有人会生气,因为计数不是100%实时的。最好将帖子计数存储在分类表中,并每次更新。Bcoz每次获取posts计数时,都必须连接到posts表并计数posts。这可能会降低响应速度。“使用适当的索引…”-如果类别少于30个左右和/或数据分布不均匀,则类别索引将降低系统速度,而不是加快系统速度。