具有许多空值的表与2个单独的表

时间:2012-12-16 05:35:26

标签: sql database sql-server-2008 database-design

我有一个包含10列的表(X),其中6列是可以为空的外键(bigint数据类型),并且每行中有5列为NULL。

解决方案:将表(X)分成2个表:(X)和(XType),以便(X)包含一个大的int列(不是外键),用于插入六个ID和一个{{ 1}}列用于确定6个数据的类型。

这个解决方案是最优的还是第一个有10列的表更好?

2 个答案:

答案 0 :(得分:2)

我更喜欢你的第一个选择。

如果您拥有这6个单独的外键列,那么您可以通过对这6个引用表实际具有外键约束强制引用完整性

如果您使用单个IDID_Type超智能方法,则无法再强制执行参照完整性。

能够真正强制执行参照完整性对我的好处远远超过 "有益于" 一个ID列;有一些NULL值的列不是

答案 1 :(得分:0)

Marc_s's answer绝对是正确的,让我再添加一个花絮:您不太可能通过第二种方法节省空间(并通过扩展,改进缓存)。 MS SQL Server将对位字段中的字段的“NULL-iness”进行编码,并且6个可以为空的列可以由单个字节表示。第二种方法中的“类型”字段不会少于一个字节。

BTW,如果您的FK类型不同,您的第二种方法需要将FK值存储为“最小公分母”类型(可能是字符串)并手动执行类型转换,因此您也会丢失域的完整性。