请教数据库方面的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
engHacker
V2EX    数据库

请教数据库方面的问题

  •  
  •   engHacker 2015-08-02 21:46:56 +08:00 1744 次点击
    这是一个创建于 3806 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    谢谢!

    第 1 条附言    2015-08-03 09:10:07 +08:00
    谢谢各位。反正用户量不大,决定暂时有评论+1。再次感谢各位。
    20 条回复    2015-08-05 09:40:05 +08:00
    immjun
        1
    immjun  
       2015-08-02 21:53:33 +08:00
    redies 然后定时任务?
    engHacker
        2
    engHacker  
    OP
       2015-08-02 21:54:45 +08:00
    @immjun redis没用过,可以看看。我这么设计,表结构有问题吗?
    omengye
        3
    omengye  
       2015-08-02 22:28:58 +08:00
    评论表里的评论id跟文章id多对一就行呀, 获取评论数的时候就count一下评论id就行
    wkdhf233
        4
    wkdhf233  
       2015-08-02 22:33:18 +08:00
    评论数这种东西用到的时候count就行,不用单独弄个值来存。。
    zhangwei1996
        5
    zhangwei1996  
       2015-08-02 22:44:40 +08:00
    竟然用文章表的一个字段存评论数?
    hahasong
        6
    hahasong  
       2015-08-02 22:48:15 +08:00
    用一个字段存评论数没问题,冗余起来,比每次 count效率高多了。唯一要小心的是新增和删除评论的时候要注意相应加减。你现在的结构,确实是有新评论就 +1
    mikan
        7
    mikan  
       2015-08-02 22:48:23 +08:00
    取count,不要把整个对象拿出来
    zonghua
        8
    zonghua  
       2015-08-03 00:34:03 +08:00 via iPhone
    @hahasong 加一不就会有锁的问题?
    hahasong
        9
    hahasong  
       2015-08-03 00:46:44 +08:00
    @zonghua 生产环境这么用过,没问题。同一秒钟并发写不会太多,最多顺序执行
    shakoon
        10
    shakoon  
       2015-08-03 00:51:29 +08:00
    同意6楼
    hxndg
        11
    hxndg  
       2015-08-03 04:12:10 +08:00
    @hahasong
    实际上我不太明白就是数据库里有没有那种类似static的东西,一个类只有一个
    Pylonight
        12
    Pylonight  
       2015-08-03 04:34:02 +08:00
    用触发器咯?交给数据库系统去做,就不用管锁不锁了。insert到评论表的时候触发这个触发器,触发器功能是更新所述文章的评论数;删除评论同样要一个触发器。
    xinyewdz
        13
    xinyewdz  
       2015-08-03 08:58:51 +08:00
    每次新评论+1,是比较好的方法。一篇文章的评论数是不会太多的,总体来说是写少读多。
    lichao
        14
    lichao  
       2015-08-03 09:05:49 +08:00   1
    看场景。如果要显示一批文章列表,同时要求显示评论数,你用 article.comment_count 取的话,就会产生类似 N+1 的问题,所以 article 表中最好冗余这个 comment_count 的字段
    idblife
        15
    idblfe  
       2015-08-03 10:38:12 +08:00
    @Pylonight
    触发器和自己手工来做是一样的问题,没有任何优势,还增加了系统维护的复杂性。
    jhdxr
        16
    jhdxr  
       2015-08-03 11:17:58 +08:00
    14L +1,如果在文章列表要显示难道还用count + group by?我觉得第一思路就是加个冗余字段啊。。。居然那么多人觉得应该要count好意外
    kikyous
        17
    kikyous  
       2015-08-03 11:32:35 +08:00
    用一个值来存储评论数量,在rails中叫counter_cache
    invite
        18
    invite  
       2015-08-03 16:06:44 +08:00
    这个设计,相当巧妙。
    Pylonight
        19
    Pylonight  
       2015-08-04 19:23:30 +08:00
    @idblife 是吗?还请您不吝赐教
    idblife
        20
    idblife  
       2015-08-05 09:40:05 +08:00
    @Pylonight
    举个简单的例子
    触发器不属于你的版本控制范围内吧
    更别说数据库内部的性能了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1255 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 16:55 PVG 00:55 LAX 08:55 JFK 11:55 Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86