数据库三个范式实例讲解
来源:互联网 发布:mac air需要关机吗 编辑:程序博客网 时间:2024/05/16 05:31
原创文章,版权归 胡添发(hutianfa@163.com)所有,转载请注明出处:
http://blog.csdn.net/aidisheng/archive/2008/09/24/2970370.aspx
一、图书信息的直观表示方法:
书名 | 出版社 | 出版年份 | 第一作者 | 第二作者 | … |
白盒测试 | 科学出版社 | 2007 | … | ||
数据库管理 | 魅力出版社 | 2000 | 李四 | 王五 |
二、范式的学术定义
1. 第一范式:
消除重复的组,从而所有表中的所有记录可以被每个表中的主键唯一标识。也就是:非主键的所有字段必须依赖于主键。
2. 第二范式
所有的非键值必须完全依赖于主键,不允许部分依赖
3. 第三范式
消除传递依赖。
三、图书信息要满足第一范式:
1. 内容相识的数据列必须消除
2. 必须为每一组相关数据分别创建一个数据表
3. 每条数据记录必须用一个主键来标识
Title表 | |||||
书名 | 出版社 | 出版年份 | 第一作者 | 第二作者 | … |
白盒测试 | 科学出版社 | 2007 | … | ||
数据库管理 | 魅力出版社 | 2000 | 李四 | 王五 |
Title表 | ||||
ID | 书名 | 出版社 | 出版年份 | 作者 |
1 | 白盒测试 | 科学出版社 | 2007 | |
2 | 白盒测试 | 科学出版社 | 2007 | |
3 | 数据库管理 | 魅力出版社 | 2000 | |
4 | 数据库管理 | 魅力出版社 | 2000 | 李四 |
5 | 数据库管理 | 魅力出版社 | 2000 | 王五 |
四、图书信息要满足第二范式:
1. 只要数据列里的内容出现重复,就应该把数据表拆分为多个表
2. 拆分形成的数据表必须用外键关联起来
在本例中,Title表中的书名是重复的,原因是因为要表现与作者的关系才重复的,所以要消除它,就需要把作者的信息拆分出来:
Title表 | |||
ID | 书名 | 出版社 | 出版年份 |
1 | 白盒测试 | 科学出版社 | 2007 |
2 | 数据库管理 | 魅力出版社 | 2000 |
Authors表 | ||
ID | TitleID(外键) | 作者 |
1 | 1 | |
2 | 1 | |
3 | 2 | |
4 | 2 | 李四 |
5 | 2 | 王五 |
在作者表中,名字还是存在重复,所以可以进一步改进为三个表:
Title表 | |||
ID | 书名 | 出版社 | 出版年份 |
1 | 白盒测试 | 科学出版社 | 2007 |
2 | 数据库管理 | 魅力出版社 | 2000 |
Authors表 | |
ID | 姓名 |
1 | |
2 | |
3 | 李四 |
4 | 王五 |
Rel_title_author表 | |
TitleID (外键) | AuthorID (外键) |
1 | 1 |
1 | 2 |
2 | 1 |
2 | 3 |
2 | 4 |
五、图书信息要满足第三范式:
与主键没有直接关系的数据列必须消除(创建一个表来存放他们)。 如:本例中出版社与书的名字没有必然的联系
Title表 | |||
ID | 书名 | PublisherID (外键) | 出版年份 |
1 | 白盒测试 | 1 | 2007 |
2 | 数据库管理 | 2 | 2000 |
Authors表 | |
ID | 姓名 |
1 | |
2 | |
3 | 李四 |
4 | 王五 |
Rel_title_author表 | |
TitleID (外键) | AuthorID (外键) |
1 | 1 |
1 | 2 |
2 | 1 |
2 | 3 |
2 | 4 |
Publishers表 | |
ID | 名称 |
1 | 科学出版社 |
2 | 魅力出版社 |
总结:
在实际工作中,往往要等到数据库里已经有了足够多的测试数据之后才会注意到种种冗余的现象,然后才会清楚地知道怎样拆分数据表最合适。
- 数据库三个范式实例讲解
- 数据库三个范式实例讲解
- 数据库三个范式实例讲解
- 数据库规范化三个范式应用实例
- 数据库规范化三个范式应用实例
- 数据库三个范式
- 数据库的三个范式
- 数据库的三个范式
- 数据库设计 三个范式
- 数据库的三个范式
- 数据库的三个范式
- 数据库表三个范式
- 数据库的三个范式
- 数据库:三个范式
- 数据库设计三个范式
- 数据库范式的讲解
- 数据库三范式讲解
- 数据库三范式讲解
- 让你的PLSQL Developer方便地访问不同字符集的数据库
- i约瑟夫环
- 请教 lucene的用法
- Zotero介绍
- (转帖)gcc参数详解
- 数据库三个范式实例讲解
- 集线器
- 交换机
- 正在运行的程序无法在任务栏上显示出来了
- ATM交换机
- 用SmartWin++写的一个Winsock测试程序
- 解决Can't write .viminfo file $HOME/.viminfo错误
- 五种提高 SQL 性能的方法
- JavaWebStudio 2005 设置环境时显示内存不足--解决方案