最近在做相關(guān)賬戶資金存儲的設計,希望能對余額進行實時的存儲,同意能夠快速地查詢到相應賬戶的當前賬戶余額。沒有做過財務相關(guān)的開發(fā)設計,因此戰(zhàn)術(shù)想了很久,簡單把思考過程寫一下。做參考,也歡迎專業(yè)人士指正。
設計需求
- 存儲收支流水
- 顯示每筆流水當前的余額情況
- 查詢對應賬戶當前余額
原始數(shù)據(jù)表
t_jounal
| id | user_id | price | type |
|---|---|---|---|
| 1 | 0001 | 1000 | in |
| 2 | 0001 | -300 | out |
| 3 | 0002 | 2000 | in |
| 4 | 0001 | 1300 | in |
| 5 | 0003 | -400 | out |
最開始的思路是直接寫視圖查詢出相關(guān)的數(shù)據(jù)
select user_id,sum(price) from t_jounal group by user_id;
這樣做比較快,可以實時算出當前賬戶余額,但是不好在流水上對每筆流水目前的余額情況進行表示。
之前問題在銀行工作的同事,余額的設計是不是在每一部分都需要同步存儲,他們給的答復是在每次操作
都會對當前的余額情況進行一次存儲。因此接下來就在想怎么將余額進行同步存儲。這個Excel特別好做。
開始想著直接寫存儲過程,但是這個應用都是進行批處理,方案不好,還是直接通過insert語句進行插入:
- 在表中添加余額列(如下表)
t_jounal
| id | user_id | price | balance | type |
|---|---|---|---|---|
| 1 | 0001 | 1000 | 1000 | in |
| 2 | 0001 | -300 | 700 | out |
| 3 | 0002 | 2000 | 2000 | in |
| 4 | 0001 | 1300 | 2000 | in |
| 5 | 0003 | -400 | -400 | out |
- 查詢到上一條記錄的余額,并與本次插入的金額進行求和,算出本次的余額
插入數(shù)據(jù){user_id:"0001",price:"300",type:"in"}
insert into t_jounal(user_id,price,balance,type) values(0001,300,300+(select balance from t_jounal where id=max(id) and user_id=0001));
SQL語句有問題,我寫的數(shù)據(jù)庫里只是單用戶,因此可以直接通過自增的ID進行判斷取最近的一條記錄進行處理
從這里也看出來其中有很多問題,另外一點,如果是插入的第一條記錄,那會出現(xiàn)插入錯誤的情況。寫了
好久都存在一定的問題,最后放棄了。最后,想到了用觸發(fā)器來解決這個問題。
首先建立一個表對每一個賬戶進行余額存儲,滿足查詢當前余額的問題,同時,使用觸發(fā)器,在每次進行
流水插入的時候,通過賬戶余額表中的余額加上插入金額進行計算,算出當前流水余額,同時更新流水以及余額表。
t_balance
| id | balance |
|---|---|
| 0001 | 0 |
CREATE DEFINER=`root`@`localhost` TRIGGER `db`.`t_jounal_before_INSERT` before INSERT ON `t_jounal` FOR EACH ROW
BEGIN
set NEW.balance = NEW.price + (select balance from t_balance where id = NEW.user_id);
update t_balance set balance = NEW.balance where id = NEW.user_id;
END
基本解決問題,可以進行同步更新,注意由于對插入的行進行了字段的更新,因此要使用before的insert