Php 寻找存储/缓存计数的推荐方法

Php 寻找存储/缓存计数的推荐方法,php,mysql,caching,architecture,Php,Mysql,Caching,Architecture,我正在用php/mysql建立一个网站,在那里会有帖子和评论 帖子需要显示评论的数量。我在Posts表中有count\u comments列,并在每次创建或删除评论时更新它 最近有人建议我,用这种方式去规范化是个坏主意,我应该改用缓存。我的看法是:你做的事情是正确的。原因如下: 将字段计数注释视为而非是数据模型的一部分-这很容易证明,您可以删除此字段的所有内容,重新创建它也很简单 相反,将其视为一个缓存,其存储与帖子位于同一位置-非常智能,因为无论何时您需要查询帖子,都可以免费获得它我的看法是:

我正在用php/mysql建立一个网站,在那里会有帖子和评论

帖子需要显示评论的数量。我在Posts表中有
count\u comments
列,并在每次创建或删除评论时更新它


最近有人建议我,用这种方式去规范化是个坏主意,我应该改用缓存。

我的看法是:你做的事情是正确的。原因如下:

将字段计数注释视为而非是数据模型的一部分-这很容易证明,您可以删除此字段的所有内容,重新创建它也很简单


相反,将其视为一个缓存,其存储与帖子位于同一位置
-非常智能,因为无论何时您需要查询帖子,都可以免费获得它

我的看法是:您做的事情是正确的。原因如下:

将字段计数注释视为而非是数据模型的一部分-这很容易证明,您可以删除此字段的所有内容,重新创建它也很简单


相反,将其视为一个缓存,其存储与帖子位于同一位置
-非常智能,因为无论何时您需要查询帖子,都可以免费获得它

我不知道“缓存”是什么意思,我对我必须提供的其他答案感兴趣:

从数据库中删除冗余信息是很重要的,而且,以一种“相信的方式”(意思是我没有真正测试它,它只是推测性的),我认为从数据库中使用SUM()函数是一种更好的方法。 假设您的所有评论都有一个post_id,那么您所需要的是:

SELECT SUM(id) FROM comments WHERE id = {post_id_variation_here}

通过这种方式,您可以减少1个常量CRUD,仅用于读取有多少评论并提高性能。

我不知道“缓存”是什么意思,我将对我必须提供的其他答案感兴趣:

从数据库中删除冗余信息是很重要的,而且,以一种“相信的方式”(意思是我没有真正测试它,它只是推测性的),我认为从数据库中使用SUM()函数是一种更好的方法。 假设您的所有评论都有一个post_id,那么您所需要的是:

SELECT SUM(id) FROM comments WHERE id = {post_id_variation_here}

通过这种方式,您可以减少1个常量CRUD,以读取评论的数量并提高性能。

我不认为这是一种不好的方法

我认识到的一点是,当代码库通过更严格的方法扩展时,很容易引入副作用。好的方面是,在某个时刻,数据库中的行数必须计算或跟踪,实际上没有办法摆脱这种情况

我不反对这一点。还有其他方法可以获得评论数量。退房

解决方案在选择时速度较慢,但需要较少的代码来跟踪注释计数



我要说的是,您的方法避免了极限去优化,这是一个优点。

我认为这不是一个坏方法

我认识到的一点是,当代码库通过更严格的方法扩展时,很容易引入副作用。好的方面是,在某个时刻,数据库中的行数必须计算或跟踪,实际上没有办法摆脱这种情况

我不反对这一点。还有其他方法可以获得评论数量。退房

解决方案在选择时速度较慢,但需要较少的代码来跟踪注释计数



我要说的是,您的方法避免了限制去优化,这是一个优点。

除非您的应用程序每秒没有数百或数千次点击,否则使用这样的SQL语句没有什么错:

select posts_field1, ..., (select count(*) from comments where comments_parent = posts_id) as commentNumber from posts

无论如何,您都可以缓存页面的html输出。这样就不必进行任何数据库查询。

除非您的应用程序每秒没有数百或数千次点击,否则使用这样的SQL语句没有错:

select posts_field1, ..., (select count(*) from comments where comments_parent = posts_id) as commentNumber from posts

无论如何,您都可以缓存页面的html输出。这样就不需要进行任何数据库查询。

也许您可以将post表和comment表相互连接起来,并使用mysql函数mysql\u num\u rows统计mysql中的注释行。像这样:

Post表

postid*
postcontent
commentid
postid*
comment
评论表

postid*
postcontent
commentid
postid*
comment
然后计算mysql中的评论,如:

$link = mysql_connect("localhost", "mysql_user", "mysql_password"); 
mysql_select_db("database", $link);

$result = mysql_query("SELECT * FROM commenttable WHERE postid = '1'", $link); 
$num_rows = mysql_num_rows($result);

也许您可以将post和comment表相互连接,并使用mysql函数mysql\u num\u rows统计mysql中的注释行。像这样:

Post表

postid*
postcontent
commentid
postid*
comment
评论表

postid*
postcontent
commentid
postid*
comment
然后计算mysql中的评论,如:

$link = mysql_connect("localhost", "mysql_user", "mysql_password"); 
mysql_select_db("database", $link);

$result = mysql_query("SELECT * FROM commenttable WHERE postid = '1'", $link); 
$num_rows = mysql_num_rows($result);

这是一种几乎不需要的优化,原因有二:

1) 适当的索引将使简单计数非常快。确保您的
评论。post\u id
列有索引


2) 当您需要缓存此值时,您将需要缓存更多的内容。如果您的站点有太多的帖子、评论、用户和流量,您需要缓存全部评论,那么您几乎肯定需要对大部分数据/输出采用缓存策略(将构建页面保存为静态、memcache等). 毫无疑问,这些策略将包含您的全部评论,使表域方法变得毫无意义。

这是一种几乎不需要的优化,原因有两个:

1) 适当的索引将使简单计数非常快。确保您的
评论。post\u id
列有索引

2) 当您需要缓存此值时,您将需要缓存更多的内容。如果您的站点有如此多的帖子、评论,请使用