2011-06-25 68 views
3

我們有一個web應用程序,用於跟蹤定期付款的貸款,目前我們正在這樣的管理是在MySQL數據庫:有以下的列數據庫架構設計用於償還貸款管理

loan_payments[ id, customerId, installmentNo, installmentAmount, penalty, previousOutstanding, totalReceivable, amountReceived ]

receipts表有以下的列 [ id, loan_payments.id (FK), paymentAmount, otherPaymentDetails]

代碼流程如下:

  1. 創建新貸款期間,nrInstallments行被輸入該客戶的loan_payments表中。 假設有固定10個分期付款爲所有客戶,10行,將創建
  2. 對於第一行(installmentNo = 1)時,penaltypreviousOutstanding將被設置爲0。
  3. 每當接收到一個新的付款,在當前分期付款(installmentNo = 1)amountReceived增加了該數額,並在payments表中完成一個條目。 *在任何給定時間只有ONE流裝置*
  4. 當它的時刻爲下一期(installmentNo = 2),上一期的[ totalReceivable - amountReceived ]插入到下一期的(installmentNo = 2)previousOutstanding。所有以前的付款/分期付款都被凍結。並向客戶發送暗示,要求支付installmentAmount,penaltypreviousOutstanding
  5. 現在所有付款都將從當前分期付款(installmentNo = 2)收到,並且每當收到新付款時,其接收的金額都會增加。
  6. 所有的罰款計算將完成對當前分期付款。

目前我們不提供任何不屬於當前分期付款的更新/刪除。

一切工作正常,直到客戶要求更新/刪除以前的付款功能。以下是我們將面臨的問題,如果我們允許更新/刪除之前的付款

  • 假設的當前分期付款沒有爲5,如果用戶更新付款與分期付款無2,previousOutstandingpenalty所有的計算將是錯的。這是沒有意義的,因爲暗示已經發送給客戶。

  • 目前有很多報告使用previousOutstandingpenalty列。

我們的疑問:

  1. 是好設計,存儲在數據庫中previousOutstandingpenalty?還是應該在代碼中計算?
  2. 我們如何重新設計邏輯/數據庫以允許以下內容。
    1. 任何 installmentNo
    2. 採取支付允許更新/刪除任何先前的付款
    3. 靈活的罰款計算的。 (如果需要,從用戶處取得%)
    4. 能夠免除特定客戶對特定分期付款的罰款。
    5. 如果可能的話,報告顯示針對給定客戶的哪些分期付款沒有扣除多少罰款。 (如果這個要求使得設計複雜,我們就可以讓它)

回答

2

帳戶數據庫應該很容易審計,這意味着它是更好,使其追加只,而不是編輯任何舊行。如果某些列包含預先計算的聚合,則通過放棄這些聚合進行非規範化處理,並將它們放入視圖中,以便您的報告仍然有效。您使用聚合值快照發送的郵件應該存儲在另一個僅附加表格中,並且由於您將這些快照定義爲快照,因此它們不會變得不準確。

+0

同意。我將把修改記錄爲引用同一批的單獨記錄。您可以根據新記錄調整未付餘額和罰金餘額。 –