如果我有一个表格,其中每一行都是客户预订,那么在此表中有两个外键是可以的:一个是空的,另一个是引用主键的。我有两个表应用于此表的外键约束的原因是预订可以是服务包(service_package)或单个服务(服务)的预留。
我的猜测是,这是糟糕的设计,因为可以在同一预订行中注册两种预订,除非使用功能或存储过程强制执行限制。
此解决方案是否正常或是否有更好的方法来执行此操作,例如为所提供的服务创建更通用的表格?
答案 0 :(得分:1)
这是一种合理的方法。当特定列的值为NULL
时,连接将失败。
在MySQL中,您必须使用触发器强制执行此操作。其他数据库具有“检查约束”的概念,您可以强制执行这两个值中的一个填充。
如果您有更多列,您可能会想要切换到“类型”列以及“id”。这要求所有ID都具有相同的类型。它还需要一个触发器来确保正确填充列。并且,在进行连接时可能会导致错误。
在两种选择中,我更喜欢你的方法只有两个ID。
答案 1 :(得分:0)
虽然拥有可空的FK并没有错,但从性能的角度来看并不总是可取的。正如本post中正确提到的那样:
B树索引对于高基数数据(即具有许多可能值的列,其中列中的数据是唯一的或几乎唯一的)最有效。如果您将有许多NULL值(或任何其他重复值),查询优化器可能会选择不使用索引来过滤结果集的记录,因为执行表扫描会更快。
我会选择带有复合索引(id,type)的type / id列。