哇,已經好久沒寫啦,前段時間偷懶了。小編在接下來(到18年底)時間裏,會推出基於yii2的cms系統(jcycms),徹底開源、代碼簡單,適合初級phpcoder。接着會推出vue+yii2的簡單demo。說多了,言歸正傳 ^_^php
入行這兩年裏,一共作過兩次關於用戶帳戶的收入支出的功能。其實關於這個,如何巧妙設計一個表來知足呢,咱們也都知道關於消費和支出,它有單筆的金額,也有累計的總金額。同時作這樣的功能必定是有統計報表、月帳單、年帳單、單日消費帳單.....vue
那可能對於沒經驗的小夥伴的設計思路就是這樣:sql
(1)第一種微信
假設就這樣的字段:id、user_id、order_number、money、type、created_atyii2
type :[1-收入2-支出] money 保留2位小數的浮點數類型,對於金額可能還都是>0app
獲取總金額:select sum(money) as incomes from user_pay where type = 1 的結果 - select sum(money) as expenditure from user_pay where type = 2 的結果yii
...........spa
(2)第二種設計
假設就這樣的字段:id、user_id、order_number、income、expenditure、created_atcode
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的餘額、收入總額、支出總額經過時間來查詢出來。
分享到此結束,本文觀點來自於我的實踐,確定也不是最好的設計,有好的,看到的朋友但願留下的美言!