我有一个系统,创造一种顺序,便可以收取的房子帐户,发现金付款(COD),或者收取的信用卡。我已经创建了以下表:

订单
order_id
billingoption_id

BILLINGOPTIONS
billingoption_id

我不确定如何在下一个表格应该建立的帐单数据。我应该建立一个单独的表格,用于各类型的费的选项(即。鳕鱼、信用卡和的房子账户)?然后我会有另一外国的关键列在订单表,会提到一个记录的帐单数据?

有帮助吗?

解决方案

您可以做它的无论哪种方式:一个大喇叭 billingoptions 表有领域,涵盖所有类型、与空值用于的领域,不适用于特定类型,或者一群宝贝表"星关"父母 billingoptions 表。两者各有优点和缺点。

大喇叭表,

  • 这是很好的,所有的数据可以很容易地引用的一个表中。
  • 跟踪外键的依赖并进行更新或插入是有效.
  • 但是你需要更改的表格结构添加新的计费选择的未来,并且有可能无效组合的数据存储(例如,信用卡的类型和鳕鱼的标志是设置在同一个记录)。

小宝宝表,

  • 这是很好的数据分配,并反映了你的程序的对象结构密切合作。
  • 这是很好的,你可以添加新的付款选择或改变现有的无需担心会影响他人。
  • 的关系是很明确的。你可以不小心链接存入另一个款,因为该外国的关键会需要将其与一个审批。
  • 但你最终导入了很多的表格的设计,而这需要大量的加入,可能是一个痛苦的导航,而不是作为有效的时候插入和更新。

在工作中,我们最终会有小宝宝表。它看起来像这样的东西:

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)

我们所有的支付方式(信用卡,宝,谷歌结帐、支票、现金、存储信贷和金钱顺序)是抽象的,以适合这种批准-->金-->退款的比喻,和呼吁同样的方法在一个 IPaymentIPaymentProcessor 接口,不同的实现(CybersourcePaymentProcessor, PayPalPaymentProcessor, 等等)。抽象已经工作得很好,在过去的一年半中在这些不同的方法,虽然有时GUI将显示不同措辞的使用者(例如,它会说"授权"和"收费"而不是"批准"和"押金"为信用卡支付,并在屏幕上进入现金执行批准/险的步骤的一举。)

希望这是有道理的。这听起来像你实际上不存储付款的信息,但它是有用的,想想这些事情可以结束了。

其他提示

专注于事物。实际的事情。尝试简单,直接地用自然语言描述事物。

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

订单是件事。订单的属性是什么?客户,产品,付款/结算选项。

结算选项是(差不多)的事情。显然,您可以定义和识别它们。 (我不确定是否可以。从您的问题来看,您似乎可以。但如果没有一句话摘要,我不确定Billion Options会发生什么。

什么是<!>“结算数据?<!>”;这是什么东西?它有哪些属性(或属性)?

如何<!>“结算数据<!>”;与订单有关?它与结算选项有何关系?

随意更新每个问题的定义问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top