3

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

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

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

4

2 回答 2

3

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

当您拥有这 6 个单独的外键列时,您可以通过对这6 个引用的表设置实际的外键约束来强制引用完整性。

如果你有一个超级聪明的方法,一个ID和一个ID_Type,你就不能再强制引用完整性了。

对我来说,能够真正实施参照完整性的好处远远超过了只有一个列的“好处” ;ID有几列NULL值也不错

于 2012-12-16T08:21:02.103 回答
0

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

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

于 2012-12-16T15:39:30.510 回答