数据库设计的方法,哪一个?

时间:2012-09-18 14:11:22

标签: database database-design

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

信用交易很可能会到期,之后这笔贷方余额不再有效,而且会丢失。

借记交易必须存储来自哪个信用交易。

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

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

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

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

2 个答案:

答案 0 :(得分:1)

  

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

解决方案2.只需插入的交易表便于财务审计。

  

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

余额应以物理方式存储。它比通过每次需要时读取所有事务行来计算余额要快得多。

答案 1 :(得分:0)

我是IT学生,通过了一门名为数据库的课程,原谅我缺乏经验。

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

此架构在10分钟内完成。它为一个共同的商店持有交易。

enter image description here 架构解释 我有一个人可以有多个电话和地址。 人在进行交易时进行交易,

  • 您输入了卡片名称,例如美国快递, 卡类型信用卡或借记卡(MySQL工作台没有域名或约束作为电源设计器,据我所知,因此我将字段类型保留为varchar)应该有有限的字符串借记或贷记输入,
  • 卡片有效期,例如8/12,
  • 卡号,例如1111111111
  • 减少的数量,例如20.0
  • 交易的时间戳 程序在输入数据时输入
  • 并将其链接到已完成交易的人 通过person_idperson字段。 例如 1

虽然表人中的id 1具有名称John Smith

这一切提供了什么:

  1. 交易是唯一使用卡的。信用卡或借记卡都不能没有。
  2. 速度较慢的表加入系统的速度更快。
  3. 程序需要什么:

    1. 在输入交易时,字段变量exactTimestamp的连续比较小于变量cardExpiery。
    2. 持续输入卡片详情。
    3. Whats系统没有

      1. 保存特殊字段中使用的金额,但可以使用Sql查询
      2. 完成
      3. 保存金额,我发现个人信息,我的意思是你来店里,店主问我你还有多少钱?
      4. 系统不会明确地将人与卡绑在一起。 该人必须在场,并使用卡上的卡详细信息,并保持该人的匿名性。 (它应该是一个足够复杂的查询,不能由业余爱好者,例如店主手工输入),如果我想知道上次使用哪个卡片用户,我将获得他的最后一笔交易并提取卡片领域。
      5. 我希望你把这个看作是一个命题。