我有一个包含10列的表(X),其中6列是可以为空的外键(bigint数据类型),并且每行中有5列为NULL。
解决方案:将表(X)分成2个表:(X)和(XType),以便(X)包含一个大的int列(不是外键),用于插入六个ID
和一个{{ 1}}列用于确定6个数据的类型。
这个解决方案是最优的还是第一个有10列的表更好?
答案 0 :(得分:2)
我更喜欢你的第一个选择。
如果您拥有这6个单独的外键列,那么您可以通过对这6个引用表实际具有外键约束来强制引用完整性。
如果您使用单个ID
和ID_Type
的超智能方法,则无法再强制执行参照完整性。
能够真正强制执行参照完整性对我的好处远远超过 "有益于" 一个ID
列;有一些NULL
值的列不是
答案 1 :(得分:0)
Marc_s's answer绝对是正确的,让我再添加一个花絮:您不太可能通过第二种方法节省空间(并通过扩展,改进缓存)。 MS SQL Server将对位字段中的字段的“NULL-iness”进行编码,并且6个可以为空的列可以由单个字节表示。第二种方法中的“类型”字段不会少于一个字节。
BTW,如果您的FK类型不同,您的第二种方法需要将FK值存储为“最小公分母”类型(可能是字符串)并手动执行类型转换,因此您也会丢失域的完整性。