哇,已經很久沒寫啦,前段時間偷懶了。小編在接下來(到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的余額、收入總額、支出總額通過時間來查詢出來。
分享到此結束,本文觀點來自於個人實踐,肯定也不是最好的設計,有好的,看到的朋友希望留下的美言!