我有一个包含 10 列的表 (X),其中 6 个是可为空的外键(bigint 数据类型),并且每行中的 5 个将为 NULL。
解决方案:将表 (X) 分成 2 个表:(X) 和 (XType),以便 (X) 包含一个用于插入六个数据之一的大 int 列(不是外键)ID
和一个XType_id
用于确定 6 个数据类型的列。
这个解决方案是最优的还是第一个有 10 列的表更好?
我有一个包含 10 列的表 (X),其中 6 个是可为空的外键(bigint 数据类型),并且每行中的 5 个将为 NULL。
解决方案:将表 (X) 分成 2 个表:(X) 和 (XType),以便 (X) 包含一个用于插入六个数据之一的大 int 列(不是外键)ID
和一个XType_id
用于确定 6 个数据类型的列。
这个解决方案是最优的还是第一个有 10 列的表更好?
我更喜欢你的第一个选项。
当您拥有这 6 个单独的外键列时,您可以通过对这6 个引用的表设置实际的外键约束来强制引用完整性。
如果你有一个超级聪明的方法,一个ID
和一个ID_Type
,你就不能再强制引用完整性了。
对我来说,能够真正实施参照完整性的好处远远超过了只有一个列的“好处” ;ID
有几列NULL
值也不错
Marc_s 的回答是绝对正确的,让我再补充一个花絮:您不太可能使用第二种方法节省空间(并且通过扩展,改进缓存)。MS SQL Server 将在位字段中对字段的“NULL-iness”进行编码,并且 6 个 NULL-able 列可以由单个字节表示。第二种方法中的“类型”字段不会少于一个字节。
顺便说一句,如果您的 FK 具有不同的类型,则第二种方法需要将 FK 值存储为“最小公分母”类型(可能是字符串)并手动进行类型转换,因此您也会失去域的完整性。