2009-09-08 21 views
3

來自應用程序員的另一個問題,他嘗試第一次自己將數據庫模型聚合在一起。數據庫模型和計算餘額,mysql

在我的應用程序中,有用戶,帳戶和交易。我最初擁有3NF的所有桌子(或者我相信)。然後我決定爲用戶添加一個平衡字段,主要是因爲我的代碼將會開放源代碼,並且我不希望人們通過更改PHP代碼來弄亂系統的業務邏輯。因此觸發器和存儲過程會更新餘額。

現在有用戶將他們的帳戶頁面上,他們有一個平衡柱做了所有交易的列表中選擇新的要求,這樣他們就可以看着自己的平衡,每一筆交易如何變化。當然,交易和用戶在不同的表格中。

如何去做? 我目前的解決方案草圖可以看到一個balance_history表,其中包含transaction_id和user_id的外鍵。任何其他建議?謝謝。

回答

1

如果你的交易表不是很大,我向你推薦從用戶表中刪除餘額列。爲什麼balance_history如果你已經有一個交易表? 我強烈建議您從觸發器中刪除任何bussines邏輯!只有存儲過程。我建議使用觸發器只用於真正的透明操作(審計,複雜的驗證等)。 總之,我認爲你可以從用戶表中刪除餘額列,而是編寫加入用戶和交易表的視圖(例如'UserBalance')。從觸發器中刪除任何bussines邏輯,而是調用aproriate存儲過程。僅使用交易表來顯示餘額歷史記錄。 這對於不是很大的表格都是如此(3-4百萬條記錄是可以的)。對於非常大的數據庫,您需要使用分佈式緩存,垂直數據庫等。

0

存儲在數據庫中計算出的值總是充滿了潛在的錯誤。這就是說,它只是一種緩存技術,現在已經很好地理解緩存。

然而,難道是昂貴的,只是計算的帳戶頁面上運行餘額每次它的訪問?我們只是在這裏談論加法和減法。也許僅僅通過取得最後的餘額(被緩存),並計算每筆交易的運行餘額可能是可能的,並且可以節省大量的工作來維護您提出的balance_history表。

我也想補充的是,balance_history表將是一個痛苦的更新,如果舊的交易被允許插入或更新。然後,您必須更新該用戶的每個連續交易以更正運行餘額。使用視圖的運行餘額

阿列克謝·斯維裏多夫的建議是一個很好的,雖然他們可能會非常棘手寫(尤其是高效運行)。 Oracle的分析功能非常適合這種情況,但我不確定MySQL是否具有相同的功能。