【发布时间】:2017-01-03 12:20:20
【问题描述】:
想象一下下表。就我而言,我完全确定 name 必须是 unique 和 not null [唯一+非 null = 主键]。因此name 是主键。由于某些原因(可能是习惯),我自然而然地创建了一个 int 类型的主键 id 列。
其他假设:我绝对需要在我的表中保留name,并且我绝对确定name(varchar 类型)永远不会超过 20 个字符。
现在我的第一个问题是 [可能很接近的问题,预期是或否]:如果我创建这样一个表,我是否尊重 BCNF Boyce-Codd 范式?
第二个可选问题[可能是开放式问题]:在这种情况下创建列id 是一种好习惯吗?
CREATE TABLE Y (
id int,
name varchar(20),
PRIMARY KEY(id, name)
);
【问题讨论】:
-
name和id都是候选键。只能选择其中一个作为主键。要违反 BCNF,您至少需要三列(假设它有一个 PK)。 -
唯一 + 非空 = 候选键
-
@MikeSherrill'CatRecall' 是的,你是对的。这是我的错。我应该说 unique + not null = 候选键
-
@joop 是的,你是对的。这是我的错。我应该说唯一+非空=候选键。好的,所以我只需要选择一个主键。
标签: sql primary-key bcnf third-normal-form