贷款还款管理的数据库模式设计

时间:2011-06-25 15:56:36

标签: database-design

我们有一个用于跟踪贷款定期付款的网络应用程序,目前我们正在这样的mysql数据库中管理它:

带有以下列的

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

带有以下列的

receipts[ id, loan_payments.id (FK), paymentAmount, otherPaymentDetails]

代码流程如下:

  1. 在创建新贷款期间,在该客户的loan_payments表中输入 nrInstallments 行。 假设所有客户都有10个固定分期付款,则会创建10行
  2. 对于第一行(installmentNo = 1),penaltypreviousOutstanding将设置为0.
  3. 每当收到新的付款时,amountReceived会在当前分期付款(installmentNo = 1)中增加该金额,并在{{{ 1}}表。 *在任何给定时间,只有 ONE 当前分期付款*
  4. 下次分期付款的时间(payments = 2)时,上一期的installmentNo会插入下一期([ totalReceivable - amountReceived ] = 2)installmentNo。以前的所有付款/分期付款都已冻结。并且会向客户发送暗示,指示要付previousOutstandinginstallmentAmountpenalty
  5. 现在所有付款都将针对此当前分期付款(previousOutstanding = 2)收到,并且只要收到新付款,其amountReceived就会递增。
  6. 所有罚款计算将针对当前分期付款。
  7. 目前,我们不会更新/删除任何不属于当前分期付款的付款。

    一切正常,直到客户要求更新/删除以前的付款功能。如果我们允许更新/删除以前的付款,我们将面临以下问题

    • 假设当前分期付款是5,如果用户使用分期付款2更新付款,则installmentNopreviousOutstanding的所有计算都将是错误的。这是没有意义的,因为暗示已经发送给客户。

    • 目前有很多报告使用penaltypreviousOutstanding列。

    我们的疑问:

    1. penaltypreviousOutstanding存储在数据库中是否很好?或者应该在代码中计算?
    2. 我们如何重新设计逻辑/数据库以允许以下内容。
      1. ANY installmentNo
      2. 付款
      3. 允许更新/删除任何以前的付款
      4. 灵活的罚金计算。 (如果需要,从用户那里拿%)
      5. 能够免除针对特定分期付款的特定客户的罚款。
      6. 如果可能的话,报告显示给定客户对分期付款的免除罚款金额。 (如果此要求使设计变得复杂,我们可以放弃它)

1 个答案:

答案 0 :(得分:2)

会计数据库应该易于审计,这意味着最好使其仅附加而不编辑任何旧行。如果某些列包含预先计算的聚合,则通过删除它们进行非规范化,并将它们放在视图中以便报告仍然有效。您使用聚合值快照发送的邮件应存储在另一个仅附加表中,并且由于您将这些邮件定义为快照,因此它们不会变得不准确。