2

我有一个创建订单的系统,该订单可以记入房屋帐户、货到付款 (COD) 或从信用卡中收取。我创建了以下表格:

ORDERS
order_id
billingoption_id

BILLINGOPTIONS
billingoption_id

我不确定应该如何为计费数据构建下一个表。我应该为每种类型的计费选项(即 COD、信用卡和家庭账户)建立一个单独的表吗?那么我会在 Orders 表上有另一个外键列来引用计费数据的记录吗?

4

2 回答 2

9

你可以用任何一种方式来做:一个大的喇叭billingoptions表,它的字段包含所有类型,NULL 表示不适用于给定类型的字段,或者一堆“明星”父表的子billingoptions表. 两者都有其优点和缺点。

对于大喇叭桌,

  • 很高兴可以在单个表中轻松引用所有数据。
  • 跟踪外键依赖关系并执行更新或插入是有效的。
  • 但是您需要更改表结构以在将来添加新的计费选项,并且可能会存储无效的数据组合(例如,在同一记录中设置了信用卡类型和 COD 标志)。

对于小婴儿桌,

  • 数据被分区并密切反映程序的对象结构很好。
  • 很高兴您可以添加新的付款方式或更改现有的付款方式,而不必担心影响其他付款方式。
  • 关系非常明确。您不能意外地将一笔存款与另一笔存款联系起来,因为外键将要求它与批准相关联。
  • 但是您最终会在设计中引入大量表,这些表需要大量 JOIN,导航可能会很痛苦,并且在插入和更新方面效率不高。

在工作中,我们最终选择了小婴儿桌。它看起来像这样:

表顺序:
--> OrderId PK
-->(很多其他领域)

餐桌付款:
--> PaymentId PK
--> OrderId (FK) [每个订单可能有多个付款]
--> PaymentType [受限字段包含类似的值
       'PAYPAL' 或 'CREDIT',你用它来知道哪个
       要查找的婴儿表,可以包含其他
       信息]

表付款贝宝:
--> PaymentPayPalId PK
--> PaymentId FK 指向 Table Payments
--> 事务号
-->(其他 PayPal 特定字段)

表付款检查:
--> PaymentCheckId PK
--> PaymentId FK 指向 Table Payments
--> 路由号
-->(其他电子支票特定字段)

+ 其余付款类型的其他表格....

所有支付类型共享三个交易相关表:

表付款批准:
--> PaymentApprovalId PK
--> PaymentId FK 指向 Table Payments
--> 状态 [一些标志意味着“成功”、“失败”、“逆转”等]
--> ProcessorMessage [服务发回的东西,比如'(M) CVV2 Matched']
--> 金额
-->(其他行政领域)

表支付存款:
--> PaymentDepositId PK
--> PaymentApprovalId FK 指向表 PaymentApprovals
--> 状态
--> 处理器消息
--> 金额
-->(其他行政领域)

表付款退款:
--> PaymentRefundId PK
--> PaymentDepositId FK 指向表 PaymentDeposits
--> 状态
--> 处理器消息
--> 金额
-->(其他行政领域)

我们所有的付款方式(信用卡、PayPal、Google Checkout、支票、现金、商店信用和汇票)都被抽象为适合这个 Approval --> Deposit --> Refund 比喻,并且 UI 调用相同的方法anIPaymentIPaymentProcessor具有不同实现的接口(CybersourcePaymentProcessor,PayPalPaymentProcessor等)。尽管有时 GUI 会向用户显示不同的措辞(例如,它会说“授权”和“收费”而不是“批准”和信用卡支付的“存款”,输入现金的屏幕一举执行批准/存款步骤。)

希望这是有道理的。听起来您实际上并没有存储付款信息,但考虑这些事情最终会在哪里是很有用的。

于 2008-11-23T05:10:42.237 回答
8

专注于事物。实际的东西。试着先用自然语言简单、直接地描述事物。

然后,当您要求设计指导时,您可以提供定义。在某些情况下,编写定义的行为会使设计具体化。

订单就是东西。订单的属性是什么?客户、产品、付款/计费选项。

计费选项(几乎)是东西。显然,您可以定义和识别它们。(我不确定我能不能。从你的问题来看,你似乎可以。但如果没有一句话总结,我不确定 Billion Options 发生了什么。

什么是“计费数据”?这是什么东西?它有什么属性(或属性)?

“计费数据”与订单有何关联?它与计费选项有何关系?

随意用每件事的定义来更新问题。

于 2008-11-23T02:00:16.973 回答