【问题标题】:Normalizing Two Column Table规范化两列表
【发布时间】:2012-01-03 23:48:26
【问题描述】:
我正在尝试规范化数据库,我们目前有一个名为 BOOK 的表,其中 ISBN (FK) 和 CoverType 是列,它们连接在一起形成一个 PK。
即
BOOK
| ISBN | CoverType |
|__________________|_____________|
| 978-0132354790 | Hardback |
| 978-0132354790 | Paperback |
这个表是否已经规范化了?我假设它是,但我并没有太多的理由。
谢谢
【问题讨论】:
标签:
database
database-normalization
【解决方案1】:
正如您在帖子中所说,BOOK(ISBN, COVERTYPE) 已标准化,因为您的所有字段都是单值的,并且主键的任何部分都不能从它的子集派生(例如,您无法判断哪些是可能的)只需查看 ISBN 本身即可为 ISBN 提供 CoverTypes,反之亦然。
【解决方案2】:
假设将添加更多行,您可以预期“Hardback”和“Paperback”之类的值将会重复。将它们移动到单独的表(例如“CoverType”)并加入 ID 是否有意义?
【解决方案3】:
这个表是否已经规范化了?
首先是警告,然后是答案。
注意事项
关系建模中的某些术语具有非常具体的含义。 Normalized 不是其中之一,至少当有人以您的方式使用它时不会。
问“这个表在 3NF 中吗?”或“这个表在 5NF 中吗?”是有道理的,但问它是否被规范化是没有意义的。仅在 SO 上,您就可以找到“这是规范化”意味着的答案
- 在 3NF 中
- 在 5NF 中
- 它有一个 ID 号
- 少于 20 列
- 所有文本都已替换为 ID 号
只有前两个有意义。其余的和规范化一点关系都没有。
最后,我的回答
我假设您的数据是有意义的。我从来没有比会计级别更详细地处理书籍,所以我从来不需要知道 ISBN 和封面类型是如何协同工作的。
你可以像这样构建你的桌子。
create table books (
isbn varchar(13) not null,
cover_type varchar(10) not null,
primary key (isbn, cover_type)
);
如果您这样做,您将没有非主要属性(所有列都是至少一个候选键的一部分),因此您至少处于 2NF 中。没有传递依赖,因此您至少处于 3NF 中。没有多值依赖,所以至少 4NF。完全没有连接依赖,所以你处于 6NF 或“终极范式”。
在现实生活中,您可能希望对这些列进行更多限制。我会推荐至少两个。
- “cover_type”上的检查约束或外键约束。
- 计算并比较“isbn”上的校验位。
如果您只是导入,您可以编写一个外部程序在导入之前验证校验位。
【解决方案4】:
我不确定什么是不规范化的......
如果还有什么我不知道,但就我所见,它看起来不错。
【解决方案5】:
实际上,这张桌子上没有太多需要标准化的东西。你没有冗余,也没有关系。看起来不错。