gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 07:05:27 25 4
gpt4 key购买 nike

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

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

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

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

最佳答案

答案是从函数依赖的概念机械地推导出来的。

一个值存在于一种关系中,这意味着一个值必须存在于另一种关系中。当为true时,从依赖表(前者)到独立表(后者)会有外键约束

另一种看待这个问题的方式是一对一关系实际上只是一对多关系的一个特例。 only 而不是很多,你只允许一个。

在 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)
);

编辑:我注意到你的标题提出的问题与你的 body 似乎提出的问题不同。以上回答标题。

从数据库规范化的角度来看,如上所述,可能更喜欢使用多个表,以支持可空属性。空值是一种带外的说法,表示特定属性的值在某种程度上是“特殊的”,但并没有真正强制执行对可能意味着什么的任何特定解释。空值 manager_id可能意味着与空值完全不同的东西 birthdate ,即使它们具有相同的标记。

从严格抽象或学术的角度来看,添加表格在任何情况下都不会被认为是一件坏事;也不是添加属性。选择应始终基于您实际需要建模的数据类型。

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

弄清楚哪些基本上需要实际数据,并对这些(可能还有其他)配置进行性能测试,看看哪种效果最好。

关于database-design - 1 到 0..1 的关系 - FK 应该指向哪个方向?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7742963/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com