1

我正在设计一个包含交易列表的数据库。有两种交易类型,我将它们命名为贷方(添加到余额)和借方(从余额中提取)。

信用交易很可能会到期,之后该信用余额将不再有效,并且会丢失。

借记交易必须存储它们来自哪个贷记交易。

到期日总是有宽大处理的余地。它不需要精确(例如,直到一天的其余时间)。

我和我的朋友想出了两种不同的解决方案,但我们无法决定使用哪个,也许你们中的一些人可以帮助我们:

解决方案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 作业进行更新)?哪个会更快?

另外,如果你们有更好的建议,我们也很乐意听到。

4

2 回答 2

1

您认为哪种解决方案更好?

解决方案 2. 只有插入的事务表更容易进行财务审计。

余额应该物理存储还是应该计算(考虑到它可能会使用 cron 作业进行更新)?

天平应物理存储。它比每次需要时读取所有交易行来计算余额要快得多。

于 2012-09-18T14:30:36.040 回答
0

我是IT学生,已经通过了一门叫做数据库的课程,请原谅我的经验不足。

我使用 MySQL 工作台制作了这个,可以通过电子邮件将模型发送给您,不会浪费时间从图片中重新创建模型。

这个模式是在 10 分钟内完成的。它持有一家普通商店的交易。

在此处输入图像描述 架构说明 我有一个可以拥有多个电话和地址的人。人在进行交易时进行交易,

  • 您输入卡名,例如美国运通卡、信用卡类型信用卡或借记卡(据我所知,MySQL 工作台没有域或作为 power-designer 的约束,所以我将字段类型保留为 varchar)应该有限输入字符串借记卡或信用卡,
  • 卡到期日期,例如 8/12,
  • 卡号 例如 1111111111
  • 要减少的金额,例如 20.0
  • 输入数据时输入事务程序的时间戳
  • 并将其链接到通过 person_idperson 字段进行交易的人。例如 1

虽然表 person 中的 id 1 有名字 John Smith

这一切提供了什么:

  1. 交易是唯一使用卡的。信用卡或借记卡不能两者都不能。
  2. 速度较少的表连接系统的速度更快。

什么程序需要:

  1. 输入交易时,字段变量exactTimestamp 的连续比较小于变量cardExpiery。
  2. 不断输入卡的详细信息。

什么系统没有

  1. 特殊字段中使用的节省金额,但是可以通过Sql查询来完成
  2. 剩下的存钱,我查到一个个人信息,我的意思是你来店里店主问我你还有多少钱?
  3. 系统不会明确地将人与卡绑定。该人必须在场并使用带有卡详细信息的卡,并保持该人的匿名性。(它应该是一个足够复杂的查询,不能由业余爱好者手动输入,例如店主),如果我想知道上次我得到他的最后一笔交易并提取卡字段时使用的卡人。

我希望你认为这只是一个提议。

于 2012-09-18T16:34:46.993 回答