V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
greatcl
V2EX  ›  程序员

[咨询] 数据库中对账户变更值的存储方式

  •  
  •   greatcl · 2017-08-19 16:17:05 +08:00 · 3199 次点击
    这是一个创建于 2684 天前的主题,其中的信息可能已经有所发展或是发生改变。
    数据库中需要存储用户积分的流水,有一个变化值的字段,目前有两种方案:
    1. 变化值直接存储正负值的数值
    2. 变化值存正数,再增加一个字段用来标识是增加还是减少
    大家都是怎么做的,比如 v 站的积分记录?

    两种各有什么好处呢,现在想的是第一种比较方便简单一些。
    14 条回复    2017-08-20 10:44:56 +08:00
    shenjixiang
        1
    shenjixiang  
       2017-08-19 16:23:25 +08:00
    一般的做法是第二种
    greatcl
        2
    greatcl  
    OP
       2017-08-19 16:24:55 +08:00
    @shenjixiang
    这样对比第一种的优点是什么呢?需要区分增加减少时通过正负数不就可以区分了吗?
    shenjixiang
        3
    shenjixiang  
       2017-08-19 16:35:32 +08:00   ❤️ 1
    对账的时候捞取数据方便吧,数据量大了也好加索引
    realpg
        4
    realpg  
       2017-08-19 16:37:42 +08:00   ❤️ 1
    一般来说 这种模型 我都是四个表
    1. 当前余额表
    2. 楼主 1 方案
    3. 楼主 2 方案

    主要需要照顾统计和筛选时候的性能

    1.2 方案对不同的检索过滤方式有不同的性能优势
    zhangmiaoCHN
        5
    zhangmiaoCHN  
       2017-08-19 17:27:15 +08:00 via iPhone   ❤️ 1
    一般来说,数据库列属性越原子越好,所以把第二种方案比较符合范式。
    realpg
        6
    realpg  
       2017-08-19 17:36:59 +08:00
    竟然没人说我数学不好 白造了个梗
    watsy0007
        7
    watsy0007  
       2017-08-19 18:41:52 +08:00   ❤️ 1
    看业务呀。如果简化到只有这么点约束,1 和 2 没区别 ,1 更简单点
    但是通常业务中,积分会对应多种变更方式,不仅仅是+-的。所以是 2
    myliyifei
        8
    myliyifei  
       2017-08-19 19:16:48 +08:00 via Android   ❤️ 1
    听说一般财务软件要什么正负对冲,不太专业 有专业人员讲解吗
    dodo20120
        9
    dodo20120  
       2017-08-19 19:22:42 +08:00   ❤️ 1
    四柱结算法
    mliilm
        10
    mliilm  
       2017-08-19 20:04:26 +08:00 via Android
    @realpg 研究了半天,还说没有哪个方案需要两张表啊…
    irockytan
        11
    irockytan  
       2017-08-19 22:25:09 +08:00 via iPhone
    @realpg 我还在认真理解哪 4 张表,没想到是写错....
    refear99
        12
    refear99  
       2017-08-19 22:39:19 +08:00   ❤️ 1
    选 2,然后每一行里,再加 2 个字段,记录变更前的值和变更后的值
    greatcl
        13
    greatcl  
    OP
       2017-08-20 09:01:46 +08:00 via Android
    @watsy0007
    有存储变更原因的列
    Hellert
        14
    Hellert  
       2017-08-20 10:44:56 +08:00   ❤️ 1
    可以采用财务标准借贷记帐方法:
    建两个列,增加列(收入)和减少列(支出),根据业务需求写相应列就行了。
    正常积分增减记正数,如果发生记录撤消或冲红的情况,直接相应列记负数。
    好处是一目了然,如果界面上要做 grid 显示,直接列下面做合计。
    统计一段时间积分加减合计,直接那一列 sum 就可以了。
    也便于筛选所有冲红的记录,直接 select 所有值为负数的就可以。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5334 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 07:52 · PVG 15:52 · LAX 23:52 · JFK 02:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.