Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 具有多个空值的表与两个单独的表_Sql_Database_Sql Server 2008_Database Design - Fatal编程技术网

Sql 具有多个空值的表与两个单独的表

Sql 具有多个空值的表与两个单独的表,sql,database,sql-server-2008,database-design,Sql,Database,Sql Server 2008,Database Design,我有一个表(X),有10列,其中6列是可为NULL的外键(bigint数据类型),每行有5列为NULL 解决方案:将表(X)分为两个表:(X)和(XType),以便(X)包括一个大的int列(不是外键),用于插入六个ID中的一个,以及一个XType\u ID列,用于确定六个数据的类型 这个解决方案是最优的还是第一个包含10列的表更好?我更喜欢您的第一个选项 当您拥有这6个单独的外键列时,您可以通过对这6个引用表进行实际的外键约束来执行引用完整性 如果您有一个超级智能的方法,使用一个ID和一个ID

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

解决方案:将表(X)分为两个表:(X)和(XType),以便(X)包括一个大的int列(不是外键),用于插入六个
ID
中的一个,以及一个
XType\u ID
列,用于确定六个数据的类型


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

我更喜欢您的第一个选项

当您拥有这6个单独的外键列时,您可以通过对这6个引用表进行实际的外键约束来执行引用完整性

如果您有一个超级智能的方法,使用一个
ID
和一个
ID\u类型
,那么您就不能再强制执行引用完整性

对我来说,能够真正执行引用完整性的好处远远大于只有一个
ID
列的好处;拥有几个带有
NULL
值的列是不错的

绝对正确的,让我再补充一点:第二种方法不太可能节省空间(并进一步改进缓存)。MS SQL Server将对位字段中字段的“空值”进行编码,6个可空的列可以用单个字节表示。第二种方法中的“类型”字段将不少于一个字节

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

检查这个问题:还有这个问题: