我是一位存在怀疑的数据库设计师。
如果你有一个table1必须与table2或(独占或一个或另一个)table3有关系,
知道可以为空的索引字段(选项A table1)是一个错误的决定(参见O'Reilly高性能MySQL第3章或MySQL manual),但也知道连接需要花费时间来执行(选项B)......
学术界的选择将是B,但我想要一个现实世界的解释,如果它真的更好的高性能与否。
提前致谢!!
答案 0 :(得分:5)
避免可以为空的“外键”。它们有许多缺点。
当外键包含null时,并不总是强制执行引用行的约束。但是,不同DBMS之间的默认行为不一致。某些DBMS支持配置选项以更改可以为空的外键的行为,而有些则不支持。因此,从数据完整性的角度来看,SQL开发人员和用户可能不清楚可以为空的外键约束实际意味着什么。使用相同的产品在DBMS产品之间或甚至在不同服务器之间移植数据库可能会产生不一致的结果。
数据库设计工具,集成工具和其他软件并不总是正确支持它们,并且它们产生的结果可能是错误的。
外键经常在连接和其他查询逻辑中使用,这使得那些认为约束有效的用户会遇到问题。
从逻辑上讲,可以为空的“外键”约束并没有太多的逻辑意义。根据SQL标准,即使被引用的表为空,也不会违反这样的约束。这与使用空的最常见的理由之一相矛盾 - 它代表了“未知”的情况。如果没有X的有效值,则任何“未知”X当然不能是有效值 - 而SQL将允许它。
没必要。您始终可以构造表,以便不需要null。因此,为了简单和准确,最好不要使用空值而不是将它们放入其中。
答案 1 :(得分:0)
在实践中,合适的性能设计取决于访问数据的“权重”。
当频繁访问数据部分(table2或table3)时,使用“表继承”是合适的。 如果经常访问所有数据(无论table2或table3),使用“Nullable FK”是合适的。
然而,“Nullable FK”可以通过基于“表继承”的视图建立。