请教数据库方面的问题

2015-08-02 21:46:56 +08:00
 engHacker

本人菜鸟一个请教各位几个问题(先行谢过):

如何自动计算某个字段的值?比如有一个评论表和文章表,文章表中有一个字段是评论数,当有新评论时这个评论数怎么更新?(每次有评论就去给评论数加1吗?这样成本似乎比较大?)是不是我的表结构有问题?

我用了orm每次从数据库拿到的是一个对象,我想用article.comment_count的方式读取到评论数。

谢谢!

1256 次点击
所在节点    数据库
20 条回复
immjun
2015-08-02 21:53:33 +08:00
redies 然后定时任务?
engHacker
2015-08-02 21:54:45 +08:00
@immjun redis没用过,可以看看。我这么设计,表结构有问题吗?
omengye
2015-08-02 22:28:58 +08:00
评论表里的评论id跟文章id多对一就行呀, 获取评论数的时候就count一下评论id就行
wkdhf233
2015-08-02 22:33:18 +08:00
评论数这种东西用到的时候count就行,不用单独弄个值来存。。
zhangwei1996
2015-08-02 22:44:40 +08:00
竟然用文章表的一个字段存评论数?
hahasong
2015-08-02 22:48:15 +08:00
用一个字段存评论数没问题,冗余起来,比每次 count效率高多了。唯一要小心的是新增和删除评论的时候要注意相应加减。你现在的结构,确实是有新评论就 +1
mikan
2015-08-02 22:48:23 +08:00
取count,不要把整个对象拿出来
zonghua
2015-08-03 00:34:03 +08:00
@hahasong 加一不就会有锁的问题?
hahasong
2015-08-03 00:46:44 +08:00
@zonghua 生产环境这么用过,没问题。同一秒钟并发写不会太多,最多顺序执行
shakoon
2015-08-03 00:51:29 +08:00
同意6楼
hxndg
2015-08-03 04:12:10 +08:00
@hahasong
实际上我不太明白就是数据库里有没有那种类似static的东西,一个类只有一个
Pylonight
2015-08-03 04:34:02 +08:00
用触发器咯?交给数据库系统去做,就不用管锁不锁了。insert到评论表的时候触发这个触发器,触发器功能是更新所述文章的评论数;删除评论同样要一个触发器。
xinyewdz
2015-08-03 08:58:51 +08:00
每次新评论+1,是比较好的方法。一篇文章的评论数是不会太多的,总体来说是写少读多。
lichao
2015-08-03 09:05:49 +08:00
看场景。如果要显示一批文章列表,同时要求显示评论数,你用 article.comment_count 取的话,就会产生类似 N+1 的问题,所以 article 表中最好冗余这个 comment_count 的字段
idblife
2015-08-03 10:38:12 +08:00
@Pylonight
触发器和自己手工来做是一样的问题,没有任何优势,还增加了系统维护的复杂性。
jhdxr
2015-08-03 11:17:58 +08:00
14L +1,如果在文章列表要显示难道还用count + group by?我觉得第一思路就是加个冗余字段啊。。。居然那么多人觉得应该要count好意外
kikyous
2015-08-03 11:32:35 +08:00
用一个值来存储评论数量,在rails中叫counter_cache
invite
2015-08-03 16:06:44 +08:00
这个设计,相当巧妙。
Pylonight
2015-08-04 19:23:30 +08:00
@idblife 是吗?还请您不吝赐教
idblife
2015-08-05 09:40:05 +08:00
@Pylonight
举个简单的例子
触发器不属于你的版本控制范围内吧
更别说数据库内部的性能了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/210292

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX