3

示例:我有 2 个表
- 类别
- 帖子

将帖子编号保留在这样的类别中是否是一种好方法

类别

 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

但问题是当我在发布更改类别时在类别表中保持计数时,我也必须更新类别表中的帖子字段。在小项目中没问题,但对于大项目来说,处理计数的好方法是什么,因为我关心数据库性能

感谢所有答案

4

5 回答 5

2

My personal preference would be not to keep duplicated data in any table, until it has been proven necessary. If you are averse to writing JOIN queries, you could define a view that contains the query and you can then forget about it.

I have found in the past that proper indexes usually mean there isn't too much of a performance problem with this.

If you find it necessary to keep a count summary your categories table (for performance or other reasons), consider creating INSERT, UPDATE and DELETE triggers on your posts table so that updates can be done by the database rather than relying on the application programmers to remember what has to be done.

于 2012-12-18T09:01:37.723 回答
1

这通常取决于您的用例。

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

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

另一种方法是设置一些脏标志,如果设置它会导致更新类别表。

那么如何进行呢?首先尝试纯洁的东西,如果遇到性能问题,请分析您的使用配置文件并根据它采取行动。

于 2012-12-18T09:08:47.683 回答
1

Dr. Dan's comment is correct. It is indeed a good idea to store the count of posts in categories, but remember that if you do that "You must also have triggers to increment and decrement the count when new post is inserted or existing post is deleted" to maintain the integrity.

于 2012-12-18T09:01:56.353 回答
1

我猜你必须JOIN在两张桌子之间和GROUP BY帖子之间使用

于 2012-12-18T09:40:00.833 回答
0

正如您正确指出的那样,您知道如果单独存储计数会引入维护问题。

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

但是,在某些情况下,预先计算的计数很有意义。考虑一个按时间顺序刷新其数据的系统。除了刷新活动之外,没有其他任何东西可以将信息插入系统。这种系统非常适合预先计算的计数。

具体查看您的问题,您似乎没有该选项。这看起来是相当“博客”的东西,因此,计数可能一直在变化。

如果是我,我会从动态计数路线开始,在动态成为问题时进行预先计算。

于 2012-12-18T09:04:08.823 回答