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

请教数据库方面的问题

  •  
  •   engHacker · 2015 年 8 月 2 日 · 1771 次点击
    这是一个创建于 3836 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    谢谢!

    第 1 条附言  ·  2015 年 8 月 3 日
    谢谢各位。反正用户量不大,决定暂时有评论+1。再次感谢各位。
    20 条回复    2015-08-05 09:40:05 +08:00
    immjun
        1
    immjun  
       2015 年 8 月 2 日
    redies 然后定时任务?
    engHacker
        2
    engHacker  
    OP
       2015 年 8 月 2 日
    @immjun redis没用过,可以看看。我这么设计,表结构有问题吗?
    omengye
        3
    omengye  
       2015 年 8 月 2 日
    评论表里的评论id跟文章id多对一就行呀, 获取评论数的时候就count一下评论id就行
    wkdhf233
        4
    wkdhf233  
       2015 年 8 月 2 日
    评论数这种东西用到的时候count就行,不用单独弄个值来存。。
    zhangwei1996
        5
    zhangwei1996  
       2015 年 8 月 2 日
    竟然用文章表的一个字段存评论数?
    hahasong
        6
    hahasong  
       2015 年 8 月 2 日
    用一个字段存评论数没问题,冗余起来,比每次 count效率高多了。唯一要小心的是新增和删除评论的时候要注意相应加减。你现在的结构,确实是有新评论就 +1
    mikan
        7
    mikan  
       2015 年 8 月 2 日
    取count,不要把整个对象拿出来
    zonghua
        8
    zonghua  
       2015 年 8 月 3 日 via iPhone
    @hahasong 加一不就会有锁的问题?
    hahasong
        9
    hahasong  
       2015 年 8 月 3 日
    @zonghua 生产环境这么用过,没问题。同一秒钟并发写不会太多,最多顺序执行
    shakoon
        10
    shakoon  
       2015 年 8 月 3 日
    同意6楼
    hxndg
        11
    hxndg  
       2015 年 8 月 3 日
    @hahasong
    实际上我不太明白就是数据库里有没有那种类似static的东西,一个类只有一个
    Pylonight
        12
    Pylonight  
       2015 年 8 月 3 日
    用触发器咯?交给数据库系统去做,就不用管锁不锁了。insert到评论表的时候触发这个触发器,触发器功能是更新所述文章的评论数;删除评论同样要一个触发器。
    xinyewdz
        13
    xinyewdz  
       2015 年 8 月 3 日
    每次新评论+1,是比较好的方法。一篇文章的评论数是不会太多的,总体来说是写少读多。
    lichao
        14
    lichao  
       2015 年 8 月 3 日   ❤️ 1
    看场景。如果要显示一批文章列表,同时要求显示评论数,你用 article.comment_count 取的话,就会产生类似 N+1 的问题,所以 article 表中最好冗余这个 comment_count 的字段
    idblife
        15
    idblife  
       2015 年 8 月 3 日
    @Pylonight
    触发器和自己手工来做是一样的问题,没有任何优势,还增加了系统维护的复杂性。
    jhdxr
        16
    jhdxr  
       2015 年 8 月 3 日
    14L +1,如果在文章列表要显示难道还用count + group by?我觉得第一思路就是加个冗余字段啊。。。居然那么多人觉得应该要count好意外
    kikyous
        17
    kikyous  
       2015 年 8 月 3 日
    用一个值来存储评论数量,在rails中叫counter_cache
    invite
        18
    invite  
       2015 年 8 月 3 日
    这个设计,相当巧妙。
    Pylonight
        19
    Pylonight  
       2015 年 8 月 4 日
    @idblife 是吗?还请您不吝赐教
    idblife
        20
    idblife  
       2015 年 8 月 5 日
    @Pylonight
    举个简单的例子
    触发器不属于你的版本控制范围内吧
    更别说数据库内部的性能了
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   1382 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 16:45 · PVG 00:45 · LAX 08:45 · JFK 11:45
    ♥ Do have faith in what you're doing.