SQL Server中的表中经常存在字段为空的问题

SQL Server中的表中经常存在字段为空的问题,sql,sql-server,database,null,foreign-keys,Sql,Sql Server,Database,Null,Foreign Keys,我有一个有时为空的列。此列也是外键,因此我想知道如果此列具有权重,我是否会在性能或数据一致性方面遇到问题 我知道这是一个愚蠢的问题,但我想确定。而不是这个设计: create table Master ( ID int identity not null primary key, DetailID int null references Detail(ID) ) go create table Detail ( ID int identity not

我有一个有时为空的列。此列也是外键,因此我想知道如果此列具有权重,我是否会在性能或数据一致性方面遇到问题


我知道这是一个愚蠢的问题,但我想确定。

而不是这个设计:

create table Master (
    ID       int identity not null primary key,
    DetailID int null references Detail(ID)
)
go
create table Detail (
    ID      int identity not null primary key
)
go
考虑一下这个

create table Master (
    ID      int identity not null primary key
)
go
create table Detail (
    ID       int identity not null primary key,
    MasterID int not null references Master(ID)
)
go
现在外键永远不会为null,而详细记录的存在(或否)指示它是否存在


如果一个细节可以存在于多个记录中,请创建一个映射表来管理该关系。

这不一定有问题,只是这可能表明您的规范化设计很差。由于索引的结构方式和带有null的列的稀疏性,可能会对性能产生影响,但是在不知道您的结构或预期的查询场景的情况下,可能得出的任何结论都只是猜测

更好的解决方案可能是一个共享主键,其中表A有一个主键,而B中有零个或一个记录具有相同的主键

如果表A可以有一个或零个B,但不止一个A可以引用B,那么您拥有的是一对多关系。这可以用彼特在他的回答中所阐述的来表示。这允许多个A记录引用同一个B,而每个B又可以选择性地引用A

因此,您可以看到有两种可选结构来解决此问题,选择每种结构都不是猜测。你为什么要选择其中一个或另一个之间有着明显的理性,但这取决于你正在建模的关系的性质