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

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

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

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

代码流程如下:

>在创建新贷款期间,在该客户的loan_payments表中输入nrInstallments行.假设所有客户都有10个固定的分期付款,那么将创建10个行
>对于第一行(installmentNo = 1),惩罚和previousOutstanding将设置为0.
>每当收到新的付款时,amountReceived将按当前分期(installmentNo = 1)中的金额递增,并在付款表中完成输入. *在任何给定时间只有一个当前分期付款*
>当下次分期的时间(installmentNo = 2)时,前一部分的[totalReceivable – amountReceived]被插入到下一部分(installmentNo = 2)previousOutstanding中.以前的所有付款/分期付款都已冻结.并且将暗示发送给客户指示,分期付款,罚款和之前的优惠待支付.
>现在,将针对当前分期付款(installmentNo = 2)收到所有付款,并且每当收到新付款时,其amountReceived将递增.
>所有罚款计算将针对当前分期付款.

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

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

>假设当前分期付款是5,如果用户以分期付款2更新付款,则所有先前的优先和罚款的计算都将是错误的.这没有意义,因为暗示已经发送给客户.
>目前有很多报道使用了之前的优秀和惩罚栏目.

我们的疑问:

>在数据库中存储先前的优异和惩罚是否是好的设计?或者应该在代码中计算?
>我们如何重新设计逻辑/数据库以允许以下内容.

>对任何分期付款都要付款
>允许更新/删除任何先前的付款
>灵活的罚款计算. (如果需要,从用户获取%)
>能够免除特定分期付款的特定客户的罚款.
>如果可能的话,报告显示给定客户对哪个分期付款免除多少罚款. (如果此要求使设计变得复杂,我们可以放弃它)

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

点赞