什么样的数据库模式可以用于保存的不同种类的帐单数据?
-
10-07-2019 - |
题
我有一个系统,创造一种顺序,便可以收取的房子帐户,发现金付款(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)
我们所有的支付方式(信用卡,宝,谷歌结帐、支票、现金、存储信贷和金钱顺序)是抽象的,以适合这种批准-->金-->退款的比喻,和呼吁同样的方法在一个 IPayment
和 IPaymentProcessor
接口,不同的实现(CybersourcePaymentProcessor
, PayPalPaymentProcessor
, 等等)。抽象已经工作得很好,在过去的一年半中在这些不同的方法,虽然有时GUI将显示不同措辞的使用者(例如,它会说"授权"和"收费"而不是"批准"和"押金"为信用卡支付,并在屏幕上进入现金执行批准/险的步骤的一举。)
希望这是有道理的。这听起来像你实际上不存储付款的信息,但它是有用的,想想这些事情可以结束了。
其他提示
专注于事物。实际的事情。尝试简单,直接地用自然语言描述事物。
然后,当您要求设计指导时,您可以提供定义。在某些情况下,写定义的行为将使设计结晶。
订单是件事。订单的属性是什么?客户,产品,付款/结算选项。
结算选项是(差不多)的事情。显然,您可以定义和识别它们。 (我不确定是否可以。从您的问题来看,您似乎可以。但如果没有一句话摘要,我不确定Billion Options会发生什么。
什么是<!>“结算数据?<!>”;这是什么东西?它有哪些属性(或属性)?
如何<!>“结算数据<!>”;与订单有关?它与结算选项有何关系?
随意更新每个问题的定义问题。