我正在设计一个包含交易列表的数据库。有两种交易类型,我将它们命名为贷方(添加到余额)和借方(从余额中提取)。
信用交易很可能会到期,之后该信用余额将不再有效,并且会丢失。
借记交易必须存储它们来自哪个贷记交易。
到期日总是有宽大处理的余地。它不需要精确(例如,直到一天的其余时间)。
我和我的朋友想出了两种不同的解决方案,但我们无法决定使用哪个,也许你们中的一些人可以帮助我们:
解决方案1:
3 个表:借方、贷方、借方贷方
Debit: id | time | amount | type | account_id (fk)
Credit: id | time | amount | expiry | amount_debited | accountId (fk)
DebitFromCredit: amount | debit_id (fk) | credit_id (fk)
在表 Credit 中,amount_debited 可以在发生借记交易时更新。当发生借记交易时,DebitFromCredit 保存有关哪些贷记交易已撤回该借记交易的信息。
有一个函数getBalance()
,它将根据到期日、金额和借记金额获取余额。所以天平没有物理存储;每次都会计算。
还可以添加一个 cron 作业来检查过期交易,并可能添加一个“过期”作为类型的借记交易。
解决方案 2
3 个表:Transactions、CreditInfo、DebitInfo
Transactions: id | time | amount (+ or -) | account_id (fk)<br />
CreditInfo: trans_id (fk) | expiry | amount | remaining | isConsumed<br />
DebitInfo: trans_id (fk) | from_credit_id (fk) | amount<br />
Table Account 添加了一个“余额”列,用于存储余额。(另一种可能性是总结此帐户的交易行)。
任何交易(贷方或借方)都存储在表交易中,金额的符号区分它们。
贷记时,会将一行添加到 creditInfo。
在借记时,会将一行或多行添加到 DebitInfo(以根据需要处理从多个贷项中借记)。此外,信用信息行更新“剩余”列。
cron 作业在 CreditInfo 表上运行,每当找到过期行时,它都会添加一条带有过期金额的借记记录。
辩论
解决方案 1 提供了两个表之间的区别,并且每个表的获取数据都非常简单。此外,由于并不真正需要 cron 作业(除非将过期数据添加为借方),getBalance()
因此可以获得正确的当前余额。需要某种联接来获取用于报告的数据。没有多余的数据。
解决方案 2 将两个事务保存在一个表中,其中 + 和 - 表示金额,并且该表没有发生更新;只插入。信用信息将在到期(cron 作业)或借记时更新。单表查询以获取用于报告的数据。一些冗余。
选择?
您认为哪种解决方案更好?余额应该物理存储还是应该计算(考虑到它可能会使用 cron 作业进行更新)?哪个会更快?
另外,如果你们有更好的建议,我们也很乐意听到。