答案是机械地从功能依赖的概念推导出来的。
如果一个值存在于一个关系中,则意味着一个值必须存在于另一个关系中。这样的话,从依赖表(前者)到独立表(后者)会有外键约束
另一种看待这个问题的方式是,一对一关系实际上只是一对多关系的一个特例;只有一个,而不是很多。
在 SQL 中:
CREATE TABLE independent (
id INTEGER PRIMARY KEY
);
CREATE TABLE dependent (
independent_id INTEGER UNIQUE NOT NULL FOREIGN KEY REFERENCES independent(id)
);
就像一对多一样,“多”有一个“一”的外键,但要将“多”变成“一”,只需将其设为unique。通过将依赖关系上的外键列作为该关系的主键来表达所有这些通常很方便:
CREATE TABLE dependent (
independent_id INTEGER PRIMARY KEY FOREIGN KEY REFERENCES independent(id)
);
编辑:我注意到您的标题提出的问题与您的身体似乎提出的问题不同。以上回答了标题。
从数据库规范化的角度来看,可能更喜欢使用多个表,如上所述,以支持可为空的属性。 Null 是一种带外方式,表示特定属性的值在某种程度上是“特殊的”,但并没有真正强制对这可能意味着什么进行任何特定的解释。空 manager_id 可能意味着与空 birthdate 完全不同的东西,即使它们具有相同的标记。
从严格的抽象或学术角度来看,添加表格绝不是一件坏事;也没有添加属性。选择应始终基于您实际需要建模的数据类型。
也就是说,使用其中一个或另一个有一些非常实际的原因。最明显的性能原因来自使用其中一种的空间成本。当通常使用可选值时,外键和相应索引使用的额外空间并不能很好地为自己付出代价。同样,如果很少使用可选值;将这些值放在另一个关系中会更紧凑。具有可为空的属性会占用表中几乎从未使用过的空间。
找出哪些基本上需要实际数据,并对这些(可能还有其他)配置进行性能测试,看看哪种效果最好。