如何设计充值消费的数据表

  哇,已经很久没写啦,前段时间偷懒了。小编在接下来(到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的余额、收入总额、支出总额通过时间来查询出来。

   分享到此结束,本文观点来自于个人实践,肯定也不是最好的设计,有好的,看到的朋友希望留下的美言!

        

原文地址:https://www.cnblogs.com/YangJieCheng/p/9040617.html