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