我们有一个用于跟踪贷款定期付款的网络应用程序,目前我们正在这样的mysql数据库中管理它:
带有以下列的 loan_payments
表
[ id, customerId, installmentNo, installmentAmount, penalty, previousOutstanding, totalReceivable, amountReceived ]
receipts
表
[ id, loan_payments.id (FK), paymentAmount, otherPaymentDetails]
代码流程如下:
loan_payments
表中输入 nrInstallments 行。 假设所有客户都有10个固定分期付款,则会创建10行 installmentNo
= 1),penalty
和previousOutstanding
将设置为0. amountReceived
会在当前分期付款(installmentNo
= 1)中增加该金额,并在{{{ 1}}表。 *在任何给定时间,只有 ONE 当前分期付款* payments
= 2)时,上一期的installmentNo
会插入下一期([ totalReceivable - amountReceived ]
= 2)installmentNo
。以前的所有付款/分期付款都已冻结。并且会向客户发送暗示,指示要付previousOutstanding
,installmentAmount
和penalty
。previousOutstanding
= 2)收到,并且只要收到新付款,其amountReceived就会递增。目前,我们不会更新/删除任何不属于当前分期付款的付款。
一切正常,直到客户要求更新/删除以前的付款功能。如果我们允许更新/删除以前的付款,我们将面临以下问题
假设当前分期付款是5,如果用户使用分期付款2更新付款,则installmentNo
和previousOutstanding
的所有计算都将是错误的。这是没有意义的,因为暗示已经发送给客户。
目前有很多报告使用penalty
和previousOutstanding
列。
我们的疑问:
penalty
和previousOutstanding
存储在数据库中是否很好?或者应该在代码中计算?答案 0 :(得分:2)
会计数据库应该易于审计,这意味着最好使其仅附加而不编辑任何旧行。如果某些列包含预先计算的聚合,则通过删除它们进行非规范化,并将它们放在视图中以便报告仍然有效。您使用聚合值快照发送的邮件应存储在另一个仅附加表中,并且由于您将这些邮件定义为快照,因此它们不会变得不准确。