一对多关系与单个表中的多个记录

时间:2015-08-13 19:36:40

标签: database database-design payment-gateway entity-relationship

我正在设计支付系统。以下哪两种设计更实用,通常实施并被认为是一种良好的做法?

设计1

考虑两个实体 - ordercredit_card_details

信用卡可能用于支付多个订单。因此,credit_card_detailsorder之间存在1:M的关系。请记住,credit_card_details中的每条记录都是唯一的,其中包含card_holder_name,cvv,expiry_date等属性。这些记录在付款时填写在表单中。此设计要求无论何时付款,我都需要查找credit_card_details表以检查是否正在使用新/旧信用卡。如果信用卡是 -

  • 旧:相应的FK被添加到order表中。

  • 新增:credit_card_details中添加了新记录,然后将相应的FK添加到order

设计2

这相对简单。我使用单个order表,其中来自先前设计的credit_card_details的所有属性都合并到前一个表中。无论何时下订单,我都不需要检查输入的信用卡详细信息是否存在,我只需将它们插入order表中即可。但是,它会附带可能重复的信用卡详细信息的费用。

1 个答案:

答案 0 :(得分:1)

个人选项1是有道理的,选项2不会给你3NF,并且数据被非规范化,因此你可能有重复的数据。如果客户退回订单并且您想要进行反向付款且卡已过期怎么办?这些只是我抛出的一些常见的曲线球。这完全取决于给定的场景。

另外想象一下,你想要一个与用户相关的所有信用卡的历史记录以及订单???,将这些存储在数据库中的逻辑方法是什么?当然是一张单独的桌子吧?

因此给定用户可能有0到多张卡。 卡可以与1个或多个订单相关联 订单总是与一张卡相关联。

考虑可能的搜索选项,并查找速度,最好在订单表中使用唯一的外键。

第三个选项可能是拥有一个Order表,Card表和OrderCard表,虽然我个人再次依赖于您的域名,虽然我认为选项三可能有点过分了?

希望这有助于您的设计