我正在设计一个包含交易列表的数据库。有两种类型的交易,我将它们命名为信用(添加到余额)和借记(从余额中取出)。
信用交易很可能会到期,之后这笔贷方余额不再有效,而且会丢失。
借记交易必须存储来自哪个信用交易。
到期日总是有宽大处理的空间。它不需要精确(例如,直到当天其他时间)。
我和我的朋友提出了两种不同的解决方案,但我们无法决定使用哪种解决方案,也许你们中的一些人可以帮助我们:
解决方案1:
3个表:借方,贷方,DebitFromCredit
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()
,它将根据到期日期,金额和amount_debited获得余额。因此没有物理存储余额;它每次计算。
还有机会添加一个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 />
表帐户添加了一个“余额”列,用于存储余额。 (另一种可能性是总结此帐户的交易行。)
任何交易(信用卡或借记卡)都存储在表格交易中,金额的符号区分它们。
在信用卡上,一行被添加到creditInfo。
在借记卡上,一行或多行被添加到DebitInfo(以便在需要时处理来自多个积分的借记)。此外,信用信息行更新“剩余”列。
cron作业适用于CreditInfo表,每当找到过期行时,它都会添加一个过期金额的借记记录。
辩论
解决方案1提供了两个表之间的区别,并且每个表的获取数据都非常简单。此外,由于不需要cron作业(除非将过期数据添加为借记),getBalance()
将获得正确的当前余额。需要某种联接才能获取报告数据。没有冗余数据。
解决方案2将两个事务保存在一个表中,+和 - 表示金额,并且此表没有更新;只插入。信用信息在到期(cron job)或借记时正在更新。单表查询以获取报告数据。一些冗余。
选择吗
您认为哪种解决方案更好?是应该在物理上存储余额还是应该计算余额(考虑到可能使用cron作业更新)?哪一个会更快?
另外,如果你们有更好的建议,我们也很乐意听到它。
答案 0 :(得分:1)
您认为哪种解决方案更好?
解决方案2.只需插入的交易表便于财务审计。
应该在物理上存储余额还是应该计算余额(考虑到可能使用cron作业更新)?
余额应以物理方式存储。它比通过每次需要时读取所有事务行来计算余额要快得多。
答案 1 :(得分:0)
我是IT学生,通过了一门名为数据库的课程,原谅我缺乏经验。
我使用MySQL工作台可以通过电子邮件向您发送模型给您,不会浪费时间从图片中重新创建模型。
此架构在10分钟内完成。它为一个共同的商店持有交易。
架构解释 我有一个人可以有多个电话和地址。 人在进行交易时进行交易,
虽然表人中的id 1具有名称John Smith
这一切提供了什么:
程序需要什么:
Whats系统没有
我希望你把这个看作是一个命题。