Database design 1到0..1关系-FK应该指向哪个方向?

Database design 1到0..1关系-FK应该指向哪个方向?,database-design,database-normalization,Database Design,Database Normalization,假设我有一个与另一个表具有1:0..1关系的客户表,我通常会在客户表中有一个指向另一个表的可空FK 但是,假设与客户相关的附加可选数据块的数量增加,并且仅仅为了参数,表的数量现在是10。是否最好使用相同的体系结构,以便customer表中有10个额外的列,如果没有存储额外的数据,则所有列都可能为null,还是最好让FK从子表指向customer表?这个模型看起来更整洁,因为我没有太多可为空的列,如果需要,我可以通过简单地添加新表和新表中指向客户的新FK列来逐步扩展系统。唯一的缺点是(查看数据库)

假设我有一个与另一个表具有1:0..1关系的客户表,我通常会在客户表中有一个指向另一个表的可空FK

但是,假设与客户相关的附加可选数据块的数量增加,并且仅仅为了参数,表的数量现在是10。是否最好使用相同的体系结构,以便customer表中有10个额外的列,如果没有存储额外的数据,则所有列都可能为null,还是最好让FK从子表指向customer表?这个模型看起来更整洁,因为我没有太多可为空的列,如果需要,我可以通过简单地添加新表和新表中指向客户的新FK列来逐步扩展系统。唯一的缺点是(查看数据库)可以添加更多违反1:0-1关系规则的行。但是,我的应用程序无论如何都不会插入额外的行

第一种方法要求我为添加到系统中的每个新表在customer表的末尾添加一个新列

在这种情况下,哪种方法最好?

部分答案:

请记住,使用1-1或1-0..1关系将表一分为二始终需要这些表之间的附加联接


如果您经常需要同时从两个表返回数据,并且这些表的负载很重,那么在一个较大的表中使用“大量空值”会更好。

答案是从函数依赖的思想机械地推导出来的

如果一个值存在于一个关系中,则意味着一个值必须存在于另一个关系中。如果这是真的,则从依赖表(前者)到独立表(后者)将有一个外键约束

从另一个角度来看,一对一的关系实际上只是一对多关系的一个特例;只允许你有一个,而不是很多

在SQL中:

CREATE TABLE independent (
    id INTEGER PRIMARY KEY
);

CREATE TABLE dependent (
    independent_id INTEGER UNIQUE NOT NULL FOREIGN KEY REFERENCES independent(id)
);
像一对多一样,“多”有一个指向“一”的外键,但要将“多”变成“一”,只需使其
唯一即可。通过将依赖关系上的外键列作为该关系的主键,通常可以方便地表达所有这些内容:

CREATE TABLE dependent (
    independent_id INTEGER PRIMARY KEY FOREIGN KEY REFERENCES independent(id)
);
编辑:我注意到你的标题提出的问题与你的身体似乎提出的问题不同。以上就是题目的答案

从数据库规范化的角度来看,可能更倾向于使用多个表,如上所述,以支持可为空的属性。空值是一种带外方式,表示特定属性的值在某种程度上是“特殊的”,但实际上并不强制执行对其含义的任何特定解释。空的
manager\u id
可能意味着与空的
出生日期
完全不同,即使它们有相同的标记

从严格的抽象或学术观点来看,添加表格并不是一件坏事;也没有添加属性。选择应该始终基于您实际需要建模的数据类型

也就是说,使用其中一种方法有一些非常实际的原因。最明显的性能原因来自使用其中一个的空间成本。当通常使用一个可选值时,外键和相应索引使用的额外空间本身并不值得。类似地,如果很少使用可选值;将这些值放在另一个关系中更为紧凑。具有可为null的属性将消耗表中几乎从未使用过的空间


找出哪些基本上需要实际数据,并对这些(可能还有其他)配置进行性能测试,以确定哪种配置工作得最好

另请参见此关系问题: