我正在尝试规范化一个数据库,我们目前有一个名为BOOK的表,其中ISBN (FK)和CoverType是列,它们连接在一起形成一个PK。
即
BOOK
| ISBN | CoverType |
|__________________|_____________|
| 978-0132354790 | Hardback |
| 978-0132354790 | Paperback | 这个表已经标准化了吗?我假设它是,但我真的没有太多的理由在背后。谢谢
发布于 2011-11-22 23:41:19
正如你在文章中所说的那样,BOOK(ISBN, COVERTYPE)是规范化的,因为你所有的字段都是单值的,主键的任何部分都不能从它的子集派生出来(例如,你不能仅仅通过查看CoverTypes本身就能分辨出哪些是ISBN的所有可能的ISBN,反过来也是如此)。
发布于 2013-03-13 08:52:05
假设将添加更多的行,您可以预期像"Hardback“和"Paperback”这样的值将被复制。把它们移到一个单独的表中,比如"CoverType“和join on ID,这不是很有意义吗?
发布于 2011-12-16 10:36:57
这个表已经标准化了吗?
首先是警告,然后是答案。
A警告
关系建模中的某些术语具有非常特定的含义。Normalized不是其中之一,至少当有人像你一样使用它时不是。
问“这个表是3NF吗?”或者“这个表是5NF吗?”是有意义的,但是问它是否被规范化是没有意义的。因此,您可以在"this is normalized“表示的地方找到答案
只有前两个是有意义的。其余的则完全与规范化无关。
最后,我的答案是
我假设你的数据是有意义的。我从来没有在会计层面上更详细地处理过书籍,所以我从来不需要知道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".
如果你只是在导入,你可以在导入之前编写一个外部程序来验证校验数字。
https://stackoverflow.com/questions/8229431
复制相似问题