数据库设计:保存不同的付款细节(信用或支票)

Hai*_*vgi 3 mysql database database-design

我有一个会员可以用三种不同的方式付款:

  1. 信用卡
  2. 校验
  3. 从银行帐户转帐

如何设计表格来记录他们的付款方式?

对于每种付款类型,必填字段会有所不同,那么如何设计一个可以消除空白字段的结构呢?

Jay*_*Jay 7

我认为错误的答案是有3张桌子.然后,在多个表中重复使用常见数据(如"支付金额"),并且像"本月支付的总额"这样的简单查询需要3表联合或联接.另外,如果添加了第四种支付类型,则必须修改在3个表上工作的任何查询,并且肯定会错过一个.

因此,有两种可能的正确答案:一个表格,其中一些字段未用于某些付款类型; 或4个表,具有公共信息的通用"支付"表,然后是3个具有特定于每种支付类型的信息的辅助表.

有些人会说出于教条原因你必须创建4个表.就个人而言,我会更实际:你有多少不同的数据?你会做什么问题?我有一些系统,我让"account_number"成为支票的银行帐号和信用卡的信用卡号,这并没有让我遇到任何明显的麻烦,尽管我对此感到有点内疚.

当数据字段的数量变大时,我倾向于将其分解,因为它会变得混乱和混乱.再次,实用主义:一个未使用的领域似乎并不太丑,但肯定有二十个未使用的领域.


Jas*_*son 5

这样做的方法是制作四个表,如果三种方式都有不同的字段。为每种不同的方法制作一张表格,为订单本身制作一张表格。在订单表中,您将存储 orderID 和用户使用哪种付款方式的枚举值(以及您需要的任何其他字段)。例如,如果您在 .NET 中编程,您可以创建一个枚举:

Public Enum PaymentMethod
    CreditCard
    Check
    WireTransfer
End Enum
Run Code Online (Sandbox Code Playgroud)

这将有效地设置为CreditCard等于 0、1CheckWireTransfer2。在您的主订单表中有一个字段,用于说明这是什么类型,并将这个整数保存在那里。在您的付款表中,主表中的 OrderID 有一个外键。如果需要,您可以在支付表中保留记录的 ID,但这是不必要的,因为您可以根据 OrderID 查找记录:

SELECT o.*, cc.* FROM Orders o 
INNER JOIN CreditCardPayments cc ON o.OrderID=cc.OrderID
WHERE cc.OrderID=[some number]
Run Code Online (Sandbox Code Playgroud)

当然,如果您有三种不同的方法,则必须先检查它是哪种付款方式,然后使用适当的SELECT语句:

SELECT PaymentMethod FROM Orders WHERE OrderID=[some number]
Run Code Online (Sandbox Code Playgroud)

确定方法后,您可以使用SELECT从不同付款方式表中调用的预制语句。

希望这可以帮助!