一.概念
1.码:用来区分不同元组(行)。码可以确定一行记录。
2.超码:{学号},{学号,姓名},{学号,年龄},{学号,姓名,年龄},{姓名,年龄}。
3.候选码:不可在拆分的超码。列如:{学号},{姓名,年龄}。不是候选码{学号,姓名},因为可以在拆分{学号}。
4.主码:程序员定的,只存在一个主码。通常说的主键(或身份证号或学号)。
二.范式
一.第一范式(1NF):属性不可再分。
for example:
1.1反例:
编号 | 产品 | 进货 | 销售 | 备注 | ||
数量 | 单价 | 数量 | 单价 |
1.2改进:
编号 | 产品 | 进货数量 | 进货单价 | 销售数量 | 销售单价 | 备注 |
二.第二范式(2NF):完全符合1NF,并且非主属性完全依赖主属性(消除了非主属性对码的部分函数依赖)。
1.如果码是多个属性构成(学生,课程)->教材,非主属性(教材)可以单独依赖于课程(课程->教材),这就违反了2NF。这就是说非主属性(教材)对码(学生,课程)s的部分函数依赖。
for example:
学生 课程 老师 老师职称 教材 教室 上课时间 |
小明 一年级语文(上) 大宝 副教授 《小学语文1》 101 14:30 |
2.违反2NF的后果:对教材的增删改都会造成影响。当校长说开门新课叫“微积分”,然后增加一本新教材《大学数学》时,学生信息还没有选课,怎么办?
3.改进:
1.学生表
学生 | 课程 | 老师 | 老师职称 | 教师 | 上课时间 |
2.课程表
课程 | 教材 |
三.第三范式(3NF):完全符合2NF,并且消除了非主属性对码的传递函数的依赖。
for example:
学生表:
学生 | 课程 | 老师 | 老师职称 | 教室 |
1.如果学生表,因为(学生,课程)->老师,老师->老师职称,非主属性(老师职称)对码(学生,课程)存在传递函数依赖关系,所以不符合3NF。
2.后果:删除老师信息,学生记录会丢失。插入一个尚无学生的新老师,学生,课程不会null.
3.改进:
学生表
学生 | 课程id | 老师id | 教室 |
课程表
课程 | 教材 |
老师表
老师 | 老师职称 |
四.BCNF:完全符合2NF,3NF,并消除了主属性对码存在的部分函数依赖或传递依赖。
for example:
一.条件
1.某公司有若干个仓库
2.每个仓库只能有一名管理员,一名管理员只能在一个仓库中工作
3.一个仓库中可以存放多种物品,一个物品也可以存放在不同的仓库。每种物品在每个仓库中都有对应的数量。
二分析:
码:(仓库名,物品名),(管理员,物品名)
主属性:仓库名,管理员,物品名
非主属性:数量
由于:(仓库名,物品名)->管理员,管理员对码(仓库名,物品名)存在部分函数依赖。同样(管理员,物品名)->仓库名。违反了BCNF.
三.表改进:
3.1物品表
仓库名 | 物品名 | 数量 |
3.2仓库表
仓库名 | 管理员名 |
四.业务上改进:
4.1如果仓库换管理员了,只需要改仓库表,不需要把以前的物品表数据都更新。
4.2如果物品删除了,仓库和管理员还存在关系。
4.3如果增加一个仓库,仓库中还没有商品,只需增加仓库表。