列'number_of_likes'或有一个单独的列......?

时间:2012-03-05 10:23:18

标签: mysql select join normalization

在我的项目中,我需要*为特定评论*计算'number_of_likes'。

目前我的 comment_tbl表的结构如下:

id    user_id   comment_details
1     10        Test1
2     5         Test2
3     7         Test3
4     8         Test4
5     3         Test5

我还有另一个表'comment_likes_tbl',结构如下:

 id    comment_id   user_id
  1       1         1
  2       2         5
  3       2         7
  4       1         3
  5       3         5

以上是样本数据。

问题:

在我的实时服务器上有大约50K的记录。我通过加入以上两个表*来计算* number_of_likes到特定的评论。 我需要知道它可以吗?

或者我应该另一个字段 comment_tbl 表来记录number_of_likes并在每次喜欢时将其增加1并将其插入 comment_likes_tbl ....?

无论如何,它帮助了我......?

先谢谢.....

4 个答案:

答案 0 :(得分:2)

是的,您应该在number_of_likes表格中再添加一个字段comment_tbl。它将减少不必要的表连接。

这样你就不需要加入,直到你需要得到谁喜欢评论。

这里可以看到的一个很好的例子是StackOverflow本身的数据库设计。 See Users表格中包含Reputation表格的Users字段。而不是每次使用这个时加入和计算用户的声誉。

答案 1 :(得分:1)

你可以采取一些不同的方法来做这样的事情

  1. 正如您现在所做的那样,运行JOIN查询以返回评论的整理结果以及每个“喜欢”的数量
  2. 随着时间的推移,你可能会发现这是对性能的影响。相反,您可以简单地使用一个计数器,该计数器会附加到每个注释字段。但是你可能会发现保留你的* comment_likes_tbl *表是有用的,因为这将是谁喜欢什么,以及什么时候的永久记录(否则,你只会有一个没有附加元数据的数字)
  3. 您可能还有一个解决方案,您只需将用户的喜欢存储在comment_likes_tbl中,然后cron任务将按照预先确定的时间表运行,以自动更新所有“类似”计数。更进一步,有一个更繁忙的网站,这可能有助于均衡性能,即使它确实意味着“喜欢”计数略微落后于实际数量。
  4. (除此之外,您还可以实现缓存解决方案等,以存储附加到注释的类似值的临时记录,MySQL也可以使用有用的缓存技术)

    但是你现在正在做的事情绝对没问题,尽管你仍然应该确保正确设置索引,否则你 会更快地注意到性能下降。 (comment_id上的非唯一索引应该足够了)

答案 2 :(得分:0)

使用查询 - 因为它们是外键,列将被编入索引,查询将很快。

答案 3 :(得分:0)

是的,你的架构很好,我会坚持,暂时。

运行太多联接可能是性能方面的问题,但只要您不必面对这些问题,就不应该关注它。

即使你遇到性能问题,你也应该先......,

  • 检查您是否使用(外国)密钥,以便MySQL可以非常快速地查找数据
  • 利用MySQL Query cache
  • 使用某种第二个缓存层,比如memcached来存储like的值(因为这只是一个增量值)。

使用memcache可以解决运行太多连接的问题,并避免创建一个不太必要的列。