2018-02-22 20:45:33
要想设计一个结构合理的数据库,首先得明确需求,并且分析数据之间的关系,数据间的关系成为数据依赖。
数据依赖分为两种:
- 函数依赖(Function dependency,FD):一种最基本的数据依赖,一个或一组属性可以决定其他的属性;
- 多值依赖(Multi-valued Dependency,MVD):一个或一组属性可以决定其他属性的多个不同值,在数据库设计的时候基本不用考虑;
- 连接依赖(Join Dependency,JD):将一张表投影拆分,若将拆分后的表连接后能够完全得到原表,则称拆分表连接依赖,在数据库设计的时候基本不用考虑;
范式介绍
- 1NF:每个属性类型都得是原子的,不能表中套表。
- 2NF:在1NF的基础上不存在部分函数依赖。
如下例,主键是(S#,C#),然而表中的姓名,年龄,地址等信息可以由S确定,也就是存在了部分函数依赖,所以不满足二范式。
如果关系不满足二范式,则会引起如下的问题:
1、插入异常:例如新生报道,由于尚未选课,所以导致无法录入姓名,年龄,地址的信息,因为主键C不能为空;
2、删除异常:例如删除所有选课信息,那么姓名等个人信息也得删除;
3、更新异常:在更新的时候很难维护,例如一个学生选课50个,那他的住址,年龄等就要冗余50次;
解决方法:one fact in one place,即一事一地,一张表管一件事。
- 3NF:在2NF的基础上不存在属性对主键的传递依赖。
如下例,SALARY -> SAL_LEVEL -> EMP,因此存在传递依赖,所以不满足三范式。
关系不满足三范式会出现的问题:
1、插入异常:例如该公司工资级别还未确定的时候,那么该级别和薪水的对照关系就没有确定;
2、删除异常:例如拿三级工资的只有一个,如果将之删除,那么三级的工资对照关系也随之删除了;
3、更新异常:在更新的时候很难维护,例如拿三级工资的有100人,那么三级工资拿的工资的对照关系就会重复100次,如果三级工资更改了,那么也需要修改100次。也就是说数据冗余量很大;
解决方法:one fact in one place,即一事一地,一张表管一件事。
- 4NF:在3NF的基础上消除数据之间可能存在的多值依赖(很少考虑)
- 5NF:在4NF的基础上消除数据之间可能存在的连接依赖(很少考虑)