sql 数据库:table 有 2 列(id 名称)和 2 个主键第三范式 Boyce-Codd 范式
sql database: table with 2 column (id name) and 2 primary key Third Normal Form Boyce-Codd Normal Form
想象以下 table。就我而言,我完全确定 name
需要 unique
和 not null
[unique+not null = primary key]。因此 name
是一个主键。由于某些原因(可能是习惯),我很自然地创建了一个int类型的主键id
列。
其他假设:我绝对需要在我的 table 中保留 name
并且我绝对确定 name
(varchar
类型)永远不会超过 20 个字符.
现在我的第一个问题是[可能是预期是或否的关闭问题]:如果我创建这样一个 table,我是否尊重 BCNF Boyce-Codd 范式?
第二个可选问题[可能是开放性问题]:在这种情况下创建列 id
是好的做法吗?
CREATE TABLE Y (
id int,
name varchar(20),
PRIMARY KEY(id, name)
);
虽然只包含两个属性的关系在 BCNF 中总是存在的,但是您的问题有点难以回答,因为文本与 table 设计不符。
如果我将您的 table 设计作为回答第一个问题的基础:您创建了一个包含两个属性 id
和 name
的 table Y
,它们是 Y
的唯一属性,它们一起构成了唯一的键,那么它总是在 BCNF 中。
当我接受你的文字描述时,你说 name
是唯一的(就关系模型而言是一个键),那么必须考虑代理属性(或键? ) id
:
一个。如果 id
也是一个键,那么 FD 是 id->name; name->id
,其中 id
是一个键, name
是一个键,这样每个 FD 都有一个键
左手边。 BCNF因此应验了。
b。如果 id
本身不是关键,但 name->id
成立,那么它仍然是
在 BCNF 中(因为唯一的 FD 在他的 LHS 上有钥匙)。虽然我会
然后不明白为什么你有一个额外的属性 id
全部.
然而,最主要的是,您的数据库方案根本不遵守文本中规定的规则:带有 (id, name)
的唯一键的表达完全错误,因为您应该 id
作为主键和 name
作为唯一约束(即替代键),反之亦然。那么在BCNF中就很明显了,对应上面的选项(a)
所以不是BCNF的问题,而是"scheme correct expressed or not"的问题。
如果每一列都是唯一的,您可能想要
CREATE TABLE Y (
id int primary key,
name varchar(20) not null unique,
);
或
CREATE TABLE Y (
id int not null unique,
name varchar(20) not null unique
);
这里的FD是id->name和name->id。
通俗地说,当你的 FD 中的每个箭头都是来自候选键的箭头时,你就满足了 BCNF。所以这满足BCNF。
出于习惯创建代理 ID 列并不是一件好事。先想想,让自己意识到权衡和副作用。
想象以下 table。就我而言,我完全确定 name
需要 unique
和 not null
[unique+not null = primary key]。因此 name
是一个主键。由于某些原因(可能是习惯),我很自然地创建了一个int类型的主键id
列。
其他假设:我绝对需要在我的 table 中保留 name
并且我绝对确定 name
(varchar
类型)永远不会超过 20 个字符.
现在我的第一个问题是[可能是预期是或否的关闭问题]:如果我创建这样一个 table,我是否尊重 BCNF Boyce-Codd 范式?
第二个可选问题[可能是开放性问题]:在这种情况下创建列 id
是好的做法吗?
CREATE TABLE Y (
id int,
name varchar(20),
PRIMARY KEY(id, name)
);
虽然只包含两个属性的关系在 BCNF 中总是存在的,但是您的问题有点难以回答,因为文本与 table 设计不符。
如果我将您的 table 设计作为回答第一个问题的基础:您创建了一个包含两个属性 id
和 name
的 table Y
,它们是 Y
的唯一属性,它们一起构成了唯一的键,那么它总是在 BCNF 中。
当我接受你的文字描述时,你说 name
是唯一的(就关系模型而言是一个键),那么必须考虑代理属性(或键? ) id
:
一个。如果 id
也是一个键,那么 FD 是 id->name; name->id
,其中 id
是一个键, name
是一个键,这样每个 FD 都有一个键
左手边。 BCNF因此应验了。
b。如果 id
本身不是关键,但 name->id
成立,那么它仍然是
在 BCNF 中(因为唯一的 FD 在他的 LHS 上有钥匙)。虽然我会
然后不明白为什么你有一个额外的属性 id
全部.
然而,最主要的是,您的数据库方案根本不遵守文本中规定的规则:带有 (id, name)
的唯一键的表达完全错误,因为您应该 id
作为主键和 name
作为唯一约束(即替代键),反之亦然。那么在BCNF中就很明显了,对应上面的选项(a)
所以不是BCNF的问题,而是"scheme correct expressed or not"的问题。
如果每一列都是唯一的,您可能想要
CREATE TABLE Y (
id int primary key,
name varchar(20) not null unique,
);
或
CREATE TABLE Y (
id int not null unique,
name varchar(20) not null unique
);
这里的FD是id->name和name->id。
通俗地说,当你的 FD 中的每个箭头都是来自候选键的箭头时,你就满足了 BCNF。所以这满足BCNF。
出于习惯创建代理 ID 列并不是一件好事。先想想,让自己意识到权衡和副作用。