Mysql 没有两行不同的表具有相同的主键吗?

Mysql 没有两行不同的表具有相同的主键吗?,mysql,database,database-design,primary-key,primary-key-design,Mysql,Database,Database Design,Primary Key,Primary Key Design,我的一个表order与另外两个表PaymentMethod1和PaymentMethod2具有一对多关系。我创建了单独的“payment method”表,因为它们具有完全不同的属性,所以我可以避免空值。但是,顺序中的特定行将链接到任何一个表的特定行--PaymentMethod1或PaymentMethod2。这要求主键值在这两个表中都是唯一的,即PaymentMethod1和PaymentMethod2中的两行不能具有相同的主键 我以这种方式为PaymentMethod1和PaymentM

我的一个表
order
与另外两个表
PaymentMethod1
PaymentMethod2
具有
一对多
关系。我创建了单独的“payment method”表,因为它们具有完全不同的属性,所以我可以避免空值。但是,
顺序中的特定行将链接到任何一个表的特定行--
PaymentMethod1
PaymentMethod2
。这要求主键值在这两个表中都是唯一的,即
PaymentMethod1
PaymentMethod2
中的两行不能具有相同的主键


我以这种方式为
PaymentMethod1
PaymentMethod2
选择主键对吗?如果是,我如何实现它?

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

如果您可以在未来投入更多的支付类型,请考虑拥有一个支付类型表,该表将保存支付类型和属性,这些类型和属性对所有支付类型都是通用的,然后是一个单独的属性表,该表将基于支付类型在行中保留属性。这样,当您放大时,会增加记录计数,而不是对象计数(表和字段)

如果继续使用现有的,则需要将订单号写入“付款类型”表中,以便加入它们,或者需要将“付款类型”以及“付款类型”主键写入“订单表”。比如:

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


你可以看到它很快就会变得丑陋。特别是当你从现在起一年后在组合中添加一个新的PaymentType时。

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

如果您可以在未来投入更多的支付类型,请考虑拥有一个支付类型表,该表将保存支付类型和属性,这些类型和属性对所有支付类型都是通用的,然后是一个单独的属性表,该表将基于支付类型在行中保留属性。这样,当您放大时,会增加记录计数,而不是对象计数(表和字段)

如果继续使用现有的,则需要将订单号写入“付款类型”表中,以便加入它们,或者需要将“付款类型”以及“付款类型”主键写入“订单表”。比如:

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


你可以看到它很快就会变得丑陋。特别是当你从现在起一年后在组合中添加一个新的PaymentType时。

MySQL没有处理这种多态性的内置方法

一种解决方案是在
订单
表中有两个外键列,一个用于第一种付款方式,一个用于第二种付款方式。允许NULL,并仅填写相应的值

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


另一种方法是将payment method键从
order
表中取出,取而代之的是有两个连接表,每个连接表对应一种支付类型。使用这些连接表将
订单
表连接到相应的付款类型。此方法还允许您使用外键约束,并且比以前的方法更规范化(不需要空值),但外键关系(和查询)更复杂。

MySQL没有处理此类多态性的内置方法

一种解决方案是在
订单
表中有两个外键列,一个用于第一种付款方式,一个用于第二种付款方式。允许NULL,并仅填写相应的值

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


另一种方法是将payment method键从
order
表中取出,取而代之的是有两个连接表,每个连接表对应一种支付类型。使用这些连接表将
订单
表连接到相应的付款类型。此方法还允许您使用外键约束,并且比以前的方法更规范化(不需要空值),但外键关系(和查询)更复杂。

我会避免使用“属性表”的模型。你曾经尝试过对EAV进行查询吗?很快就会变得很糟糕。如果要在一个表中有公共列并分支到另一个表(同样,不是EAV),那么仍然要分支到多个表,并且再次丢失了外键约束。您建议的设计是一个常见的陷阱。@jnevil,很抱歉反应太晚。他正在考试。你能详细说明一下你在建议中提到的
属性表吗?如何设计一个
属性
表来保存不同支付类型的所有额外属性?您不认为其中会有大量的
null
值(因为该表包含所有可能的额外属性,对于特定的支付类型,其中一些属性可能是
null
)。此外,如果我将来允许使用新的付款方式,我可能需要在
属性表中添加一个额外的属性。我会避免使用“属性表”的模型。你曾经尝试过对EAV进行查询吗?很快就会变得很糟糕。如果要在一个表中有公共列并分支到另一个表(同样,不是EAV),那么仍然要分支到多个表,并且再次丢失了外键约束。您建议的设计是一个常见的陷阱。@jnevil,很抱歉反应太晚。他正在考试