余额要不要单独弄个数据库表来记录?

2018-01-02 20:27:21 +08:00
 zjsxwc

目前获取用户余额是通过 sum 用户的所有账单记录表的 amount (用正负表示了收入支出)来计算的,

考虑的用户账单记录越来越多,每次 sum 效率也很低,要不要单独弄个数据库表来记录余额( KV 结构),每个用户在这个余额表里只占一行,每次用户账单记录增加就修改这个对应行,这么做如何保证余额一定是对的。

或者有什么更好的获取余额的方式?

4810 次点击
所在节点    程序员
14 条回复
pynix
2018-01-02 20:29:20 +08:00
在用户表里加个字段 balance
pynix
2018-01-02 20:30:04 +08:00
注意在修改这个字段的时候需要加行锁。。
killz
2018-01-02 20:43:43 +08:00
当然要 不然如何队长啊 不仅要计算静态值 还要注意川行修改 还要记录变动 log 还要一对一勾兑
zjsxwc
2018-01-02 20:46:22 +08:00
目前想到的办法:

每次在 orm 增加一条用户账单记录时,触发事件对 balance 字段进行加减更新( select for update 来阻塞同步保证一致),用户获取 balance 字段接口里一定几率(比如 5%的几率)触发使用 sum 方式获取 balance,然后对比获取的 balance 是否一致,不一致就以 sum 方式获取的为准,并更新 balance
zealic
2018-01-02 20:48:47 +08:00
CRQS
iEverX
2018-01-02 23:05:37 +08:00
一定保证是对的,这个是通过逻辑保证的。
4# 的方法,发现错了然后修改,这是治标不治本,bug 没找出来啊
qiayue
2018-01-02 23:32:00 +08:00
这种东西都有约定俗成的最佳做法,没必要自己想,学习别人的经验即可
javaluo
2018-01-02 23:51:01 +08:00
事务 实时 准实时 离线
thxu
2018-01-03 09:53:16 +08:00
我想到有两种方案,一种是在用户信息里面加余额字段,注意每次修改的时候要加锁(单独弄个 kv 结构的数据库差不多是同一个意思);另外一种是把历史数据汇总单独存放,比如把用户每个月的账单统计成一条数据,然后余额就通过当前月的账单记录求和加上统计的历史数据求和计算出来.
soli
2018-01-03 10:43:20 +08:00
@qiayue 能给个关键词啥的么?
miaoxinwei
2018-01-03 14:04:14 +08:00
多弄几个余额
roricon
2018-01-03 15:24:48 +08:00
一般情况下, 余额属于不是那么频繁修改的数据, 行锁就好了.
如果是 sum 所有账单的方法, 那可以每天生成一个前一日的加总值, 每次查询只需要加一下总值和当日产生的账单就好了. 不过实现起来有点麻烦, 不如直接增加余额行, 然后锁行进行加减操作.
roricon
2018-01-03 15:27:42 +08:00
其实我看到很多系统中都会在每一条交易记录中保存一个操作后余额, 有的还额外保存一个操作前余额.
这是出于查询对账的便利还是为了啥? 谁来顺道解释一下?
Keyes
2018-01-03 17:16:04 +08:00
@roricon 更多的是抗抵赖与合规上的要求,所有的交易步骤所影响的数据都应该可以被审计

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

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

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

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

© 2021 V2EX