哇,已经很久没写啦,前段时间偷懒了。小编在接下来(到18年末)时间里,会推出基于yii2的cms系统(jcycms),完全开源、代码简单,适合初级phpcoder。接着会推出vue+yii2的简单demo。说多了,言归正传 ^_^
入行这两年里,一共做过两次关于用户账户的收入支出的功能。其实关于这个,如何巧妙设计一个表来满足呢,我们也都知道关于消费和支出,它有单笔的金额,也有累计的总金额。同时做这样的功能一定是有统计报表、月账单、年账单、单日消费账单.....
那可能对于没经验的小伙伴的设计思路就是这样:
(1)第一种
假设就这样的字段:id、user_id、order_number、money、type、created_at
type :[1-收入2-支出] money 保留2位小数的浮点数类型,对于金额可能还都是>0
获取总金额:select sum(money) as incomes from user_pay where type = 1 的结果 - select sum(money) as expenditure from user_pay where type = 2 的结果
...........
(2)第二种
假设就这样的字段:id、user_id、order_number、income、expenditure、created_at
income:收入的金额
expenditure:支出的金额
获取总金额:select sum(income) as incomes from user_pay 的结果 - select sum(expenditure ) as expenditures from user_pay 的结果
...........
可能对于我们小白来讲(我也是小白哈,在之前也是这样考虑的)。那这样设计的弊端有哪些了?
首先 当只考虑金额没有负数的情况,那在页面展示的时候需要通过程序判断 将其变成负数
然后最重要的就是不利于统计,当数据量很大的时候,我想看到每个月的消费情况(单笔金额多少,余额多少),就和银行app、支付宝、微信一样的账户明细
我想上面的设计肯定不是最好的选择。那既然我们想要记录余额,那何不在之前的字段里加入balance字段呢,同时我们的金额应当是有正负的。收入(充值)就是正数,支出(消费)就是负数
那余额就是:前一次的余额+本次金额,如果是第一次那余额就是第一次的金额
用php代码表示:
function getBalance($money){ $sql = "SELECT `banlance` FROM `user_pay` WHERE 1 ORDER BY `id` DESC LIMIT 1"; $row = $db->getone($sql); if (!$row) { return $money; } return $row['banlance'] + $money;}
那这样的设计修改,就能很好的做出如上的账户明细了。如果我们在加点,可以把收入总金额加入到字段里,这样我如果找T+N的余额、收入总额、支出总额通过时间来查询出来。
分享到此结束,本文观点来自于个人实践,肯定也不是最好的设计,有好的,看到的朋友希望留下的美言!