【mysql】用户余额和收入支出mysql表设计和实现方案
因为第一次做相关业务,所以经验不足,想来取点经。
1.用户余额表除了用户id和余额还应该有哪些字段?
2.收入表和支出表是分开好还是合并?
3.比如注册送100优惠券这种场景。注册成功后给余额字段加100,给明细表添加一条记录,这2个步骤放在一个事务中,还是明细表用消息队列处理等其他解决方案。
回答
1.用户ID,余额,开始时间(创建时间),最后交易(收入,支出)改变时间,收入总额,支出总额(看情况决定是否冗余,冗余为了避免每次统计都要查库)
2.收入表和支出表看情况。如果收入来源和支出方式都有多种,适合分开,比如说收入(1.打赏,2充值,3转账),支出(1购买业务,2充值会员, 3转赠)等等
3.放在一起直接事务也可,消息队列也行,只要涉及金钱,打好日志即可。因为送钱和明细表操作都不是耗时间操作。
4.金钱计算,尽量避开浮点数,如1元应该存成100分
oder表:交易订单表
userId orderId orderPrice time
11 20170616133355700 5 6/16/2017 13:33
balance表:用户余额表
userId balance version time
11 150 1
交易时,先查询balance表,标记version信息,交易成功后比较version+1和version关系,一致则交易成功,变更金额。
优点在于非阻塞,支持高并发。
用户表有个余额和用户ID即可
数据量很大的话可以分开。 余额表字段
日志ID
用户ID
动作(充值、支出、购买等等)
变动的钱(收入用正数,支出用负数)
此时的余额(变动后的)
操作时间
操作IP
备注
放事务
放消息队列,那么用户在注册的时候不知道到底注册成功没有。万一入消息队列成功,你返回注册成功给用户,结果在拿出消息进行处理的时候报错,这就尴尬了。
就此补充下:优惠券可以单独一张记录表,注册成功券跟用户关联,余额字段不需要更动了。
1楼讲的很好,在一楼基础上补充一下自己的观点:
补充一下第2点:收入表和支出表可以放到一个表中,用source(1.1.打赏,2充值,3转账)字段表明来源,type(1.支出 2,收入)字段表明是支出或者收入
补充第3点:普通事务即可,如果存在并发较高的场景,可以使用消息队列
收入和支出最重要的就是对账了,所以需要一张表来记录充值消费等信息,其次是充值记录信息,然后就是用户余额,之前的分销商城就是这样设计的,后来网站倒闭了哈哈
可以关注我的博客 PHP程序员学习笔记
以上是 【mysql】用户余额和收入支出mysql表设计和实现方案 的全部内容, 来源链接: utcz.com/a/72441.html