2

我有一个系统可以创建一个订单,并且该订单可以通过一个账户进行计费,发送货到付款(COD)或者向信用卡收取。我创建了下面的表格:我可以使用什么数据库模式来保存不同类型的帐单数据?

订单
ORDER_ID
billingoption_id

BILLINGOPTIONS
billingoption_id

我不确定如何邻桌应计费的数据基础之上。我应该为每种类型的结算选项(即COD,信用卡和住宅帐户)建立一个单独的表格吗?那么我会在Orders表上有另外一个外键列来引用记帐数据的记录吗?

回答

8

你可以这样做:一个大鸣喇叭billingoptions表有字段s包含所有类型,对于不适用于给定类型的字段使用NULL,或者对父表billingoptions进行“脱颖而出”的一堆婴儿表。两者都有其优点和缺点。

对于大鸣喇叭表,

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

对于小宝宝表,

  • 这是很好的数据进行分区,并密切反映了你的程序的对象结构。
  • 很高兴您可以添加新的付款选项或更改现有的付款选项,而不用担心影响其他人。
  • 这些关系非常明确。您不能无意中将存款与另一笔存款挂钩,因为外键需要将其与批准关联。
  • 但是最终你在设计中引入了大量的表格,这些表格需要大量的JOIN,导航很麻烦,而且在插入和更新时效率不高。

在工作中,我们结束了去小婴儿桌。它看起来是这样的:

 
Table Orders: 
--> OrderId PK 
--> (Lots of Other Fields) 

Table Payments: 
--> PaymentId PK 
--> OrderId (FK) [There may be more than one payment per order] 
--> PaymentType [Restricted field contains values like 
     'PAYPAL' or 'CREDIT', you use this to know which 
     baby table to look up that can contain additional 
     information] 

Table PaymentsPayPal: 
--> PaymentPayPalId PK 
--> PaymentId FK points to Table Payments 
--> TransactionNo 
--> (Other PayPal specific fields) 

Table PaymentsCheck: 
--> PaymentCheckId PK 
--> PaymentId FK points to Table Payments 
--> RoutingNo 
--> (Other e-check specific fields) 

+ other tables for remaining payment types.... 

所有支付类型的企业有三个共同事务相关的表:

 
Table PaymentApprovals: 
--> PaymentApprovalId PK 
--> PaymentId FK points to Table Payments 
--> Status [Some flag meaning 'Succeeded', 'Failed', 'Reversed', etc] 
--> ProcessorMessage [Something the service sent back, like '(M) CVV2 Matched'] 
--> Amount 
--> (Other administrative fields) 

Table PaymentDeposits: 
--> PaymentDepositId PK 
--> PaymentApprovalId FK points to Table PaymentApprovals 
--> Status 
--> ProcessorMessage 
--> Amount 
--> (Other administrative fields) 

Table PaymentRefunds: 
--> PaymentRefundId PK 
--> PaymentDepositId FK points to Table PaymentDeposits 
--> Status 
--> ProcessorMessage 
--> Amount 
--> (Other administrative fields) 

我们所有的付款方式(信用卡,贝宝,谷歌结帐,支票,现金,商店信用和汇票)被抽象以符合该批准 - >存款 - >退款隐喻,并且UI在具有不同实施方式的IPaymentIPaymentProcessor接口上调用相同的方法(CybersourcePaymentProcessor,PayPalPaymentProcessor等)。尽管有时GUI会向用户显示不同的语言(例如,它会说“授权”和“收费”而不是“批准”,而且用户可能会说“授权”和“收费”),而抽象在这些不同方法的过去一年半中运行良好用于信用卡支付的“存款”和用于进入现金的屏幕一举进行批准/存款步骤。)

希望是有道理的。这听起来像是你实际上并没有存储付款信息,但考虑这些事情最终会发生的地方很有用。

8

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

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

订单是东西。订单的属性是什么?客户,产品,付款/账单选项。

结算选项是(几乎)东西。显然,你可以定义和识别它们。 (我不确定我可以,从你的问题看来,你可能可以,但是如果没有一句话总结,我不确定Billion Options会发生什么事情。数据?”什么样的事情是什么?什么属性(或属性),它有?

如何做一个‘结算数据’涉及到订单?它是如何涉及结算选项?

感觉免费更新与每个事物的定义问题。

相关问题