在表中使用2个外键是否可以,其中一个必须为空?

时间:2013-07-10 01:23:17

标签: mysql sql null foreign-keys

如果我有一个表格,其中每一行都是客户预订,那么在此表中有两个外键是可以的:一个是空的,另一个是引用主键的。我有两个表应用于此表的外键约束的原因是预订可以是服务包(service_package)或单个服务(服务)的预留。

我的猜测是,这是糟糕的设计,因为可以在同一预订行中注册两种预订,除非使用功能或存储过程强制执行限制。

此解决方案是否正常或是否有更好的方法来执行此操作,例如为所提供的服务创建更通用的表格?

2 个答案:

答案 0 :(得分:1)

这是一种合理的方法。当特定列的值为NULL时,连接将失败。

在MySQL中,您必须使用触发器强制执行此操作。其他数据库具有“检查约束”的概念,您可以强制执行这两个值中的一个填充。

如果您有更多列,您可能会想要切换到“类型”列以及“id”。这要求所有ID都具有相同的类型。它还需要一个触发器来确保正确填充列。并且,在进行连接时可能会导致错误。

在两种选择中,我更喜欢你的方法只有两个ID。

答案 1 :(得分:0)

虽然拥有可空的FK并没有错,但从性能的角度来看并不总是可取的。正如本post中正确提到的那样:

B树索引对于高基数数据(即具有许多可能值的列,其中列中的数据是唯一的或几乎唯一的)最有效。如果您将有许多NULL值(或任何其他重复值),查询优化器可能会选择不使用索引来过滤结果集的记录,因为执行表扫描会更快。

我会选择带有复合索引(id,type)的type / id列。