1

One of my tables order has one to many relationship with two other tables PaymentMethod1 and PaymentMethod2. I have created separate "payment method" tables since they have completely different attributes so that I can avoid nulls. But, a particular row in order will link to a particular row of any one table -- PaymentMethod1 OR PaymentMethod2. This requires the primary key values to be unique in both of these tables, i.e. no two rows in PaymentMethod1 and PaymentMethod2 can have same primary key.

enter image description here

Am I right in chosing primary keys for PaymentMethod1 and PaymentMethod2 in this fashion? If yes, how do I implement it?

4

2 回答 2

3

这是解决问题的一种限制方法。添加新的付款类型时会发生什么?一个新表出现了,您对所有使用订单和付款类型的查询的 JOIN 条件必须重写。

如果您将来可能会添加更多支付类型,请考虑使用一个支付类型表来保存所有支付类型始终通用的支付类型和属性,然后使用一个单独的属性表来保存行中的属性根据支付类型。这样,当您扩大规模时,您会增加记录数,而不是对象数(表和字段)。

如果您继续使用您所拥有的,则需要将订单号写入您的付款类型表以便您可以加入它们,或者您需要将付款类型类型以及付款类型主键写入订单表. 就像是:

Order Number | Payment Type Type | Payment Type Key
    1              PaymentType1           5
    2              PaymentType2           5
    3              PaymentType1           5

然后:

SELECT 
    o.Number,
    COALESCE(pm1.key, pm2.key),
    CASE WHEN o.PaymentTypeType = "PaymentType1" 
        THEN pm1.pm1_attr1
        ELSE pm2.pm2.attr3
        END as "Friendly Attribute Name"
FROM ORDER o
   LEFT OUTER JOIN PaymentMethod1 pm1 ON
       o.PaymentTypeType = "PaymentType1" AND
       o.PaymentTypeKey = pm1.key
   LEFT OUTER JOIN PaymentMethod2 pm2 ON
       o.PaymentTypeType = "PaymentType2" AND
       o.PaymentTypeKey = pm2.key

你可以看到它可能会很快变得丑陋。尤其是当您在一年后将新的 PaymentType 添加到组合中时。

于 2015-03-05T14:31:31.463 回答
2

MySQL 没有内置的方法来处理这种类型的多态性。

一种解决方案是在表中设置两个外键列order,一个用于第一种付款方式,一个用于第二种付款方式。允许NULL,并且只填写适当的一项。

此方法允许您继续使用外键约束,但它并未完全规范化。

另一种方法是从表中取出付款方式键order,取而代之的是有两个联结表,一个用于每种付款类型。使用这些连接表将order表连接到适当的付款类型。此方法还允许您使用外键约束,并且比以前的方法更规范化(不需要 NULL 值),但外键关系(和查询)有点复杂。

于 2015-03-05T14:35:19.517 回答