Hai*_*vgi 3 mysql database database-design
我有一个会员可以用三种不同的方式付款:
如何设计表格来记录他们的付款方式?
对于每种付款类型,必填字段会有所不同,那么如何设计一个可以消除空白字段的结构呢?
我认为错误的答案是有3张桌子.然后,在多个表中重复使用常见数据(如"支付金额"),并且像"本月支付的总额"这样的简单查询需要3表联合或联接.另外,如果添加了第四种支付类型,则必须修改在3个表上工作的任何查询,并且肯定会错过一个.
因此,有两种可能的正确答案:一个表格,其中一些字段未用于某些付款类型; 或4个表,具有公共信息的通用"支付"表,然后是3个具有特定于每种支付类型的信息的辅助表.
有些人会说出于教条原因你必须创建4个表.就个人而言,我会更实际:你有多少不同的数据?你会做什么问题?我有一些系统,我让"account_number"成为支票的银行帐号和信用卡的信用卡号,这并没有让我遇到任何明显的麻烦,尽管我对此感到有点内疚.
当数据字段的数量变大时,我倾向于将其分解,因为它会变得混乱和混乱.再次,实用主义:一个未使用的领域似乎并不太丑,但肯定有二十个未使用的领域.
这样做的方法是制作四个表,如果三种方式都有不同的字段。为每种不同的方法制作一张表格,为订单本身制作一张表格。在订单表中,您将存储 orderID 和用户使用哪种付款方式的枚举值(以及您需要的任何其他字段)。例如,如果您在 .NET 中编程,您可以创建一个枚举:
Public Enum PaymentMethod
CreditCard
Check
WireTransfer
End Enum
Run Code Online (Sandbox Code Playgroud)
这将有效地设置为CreditCard等于 0、1Check和WireTransfer2。在您的主订单表中有一个字段,用于说明这是什么类型,并将这个整数保存在那里。在您的付款表中,主表中的 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从不同付款方式表中调用的预制语句。
希望这可以帮助!