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

jay*_*rap 5 database-design

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

loan_payments 包含以下列的表格 [ id, customerId, installmentNo, installmentAmount, penalty, previousOutstanding, totalReceivable, amountReceived ]

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

代码流程如下:

  1. 在创建新贷款期间,会在该客户的表中输入nrInstallmentsloan_payments假设所有客户有固定的 10 期分期付款,将创建 10 行
  2. 对于第一行 ( installmentNo= 1 ),penaltypreviousOutstanding将设置为 0。
  3. 每当收到新付款时,当前分期付款 ( = 1)amountReceived中的金额就会增加,并在表中完成一个条目。*在任何给定时间只有一个当前分期付款*installmentNopayments
  4. 下一期 ( installmentNo= 2) 时,上一期的[ totalReceivable - amountReceived ]插入到下一期的 ( installmentNo= 2) 中previousOutstanding。所有以前的付款/分期付款都被冻结。并向客户发送提示,表明installmentAmountpenaltypreviousOutstanding待付款。
  5. 现在,将针对当前分期付款 ( installmentNo= 2)收到所有付款,并且每当收到新付款时,它的 amountReceived 都会增加。
  6. 所有罚款计算将针对当前分期付款进行。

目前,我们不提供不属于当前分期付款的任何付款的更新/删除。

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

  • 假设当前的分期号为5,如果用户更新为2号分期付款,则previousOutstanding和 的所有计算penalty都会出错。这是没有意义的,因为已经向客户发送了提示。

  • 当前有很多报告使用previousOutstandingpenalty列。

我们的查询:

  1. 在数据库中存储previousOutstanding和存储是好的设计penalty吗?还是应该在代码中计算?
  2. 我们如何重新设计逻辑/数据库以允许以下内容。
    1. 任何分期付款没有
    2. 允许更新/删除任何以前的付款
    3. 灵活的惩罚计算。(如果需要,从用户那里获取 %)
    4. 能够免除特定客户对特定分期付款的罚款。
    5. 如果可能,请报告显示针对特定客户的分期付款免除多少罚款。(如果这个要求使设计复杂,我们可以放弃它)

Tob*_*obu 2

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