数据库设计三范式就是数据库设计应该对应的三条准则:
第一范式举例:
- 任何一张表上必须有主键,每一个字段原子性不可再分
- 建立在第一范式基础上,要求所有非主键字段完全依赖主键,不要产生部份依赖
- 建立在第二范式的基础上,要求所有非主键字段直接依赖主键,不要产生传递依赖
学生编号 | 学生姓名 | 联系方式 |
1001 | 张三 | |
1002 | 李四 | |
1001 | 王五 |
以上表满足第一范式吗?
不满足,没有主键,且联系方式的字段可以分成邮箱和电话号码,可以把学生编号作为主键(PK),改成如下形式:
学生编号 | 学生姓名 | 邮箱 | 联系电话 |
1001 | 张三 | 155998076547 | |
1002 | 李四 | 19908764557 | |
1003 | 王五 | 18867560947 |
第二范式举例:
学生姓名 | 教师编号 | 教师姓名 | |
1001 | 张三 | 001 | 王老师 |
1002 | 李四 | 002 | 吴老师 |
1003 | 王五 | 001 | 王老师 |
1001 | 张三 | 002 | 吴老师 |
上表满足第一范式吗?
无主键,不满足,应该采取学生编号和教师编号联合主键的方式
采取联合主键的方式之后满足第二范式吗?
不满足,学生姓名依赖学生编号,教师姓名依赖教师编号,这两个字段对于主键只是部份依赖。
所以应该拆分成两三张表,修改如下:
表一 学生表,学生编号为主键
学生编号 | 学生姓名 |
1001 | 张三 |
1002 | 李四 |
1003 | 王五 |
表二 教师表,教师编号为主键
教师编号(PK) | 教师姓名 |
001 | 王老师 |
002 | 吴老师 |
表三 学生教师关系表,id为主键,学生编号和教师编号为外键(FK)
Id(PK) | 学生编号(FK) | 教师编号(FK) |
1 | 1001 | 001 |
2 | 1002 | 002 |
3 | 1003 | 001 |
4 | 1001 | 002 |
第三范式举例:
学生编号(PK) | 学生姓名 | 班级编号 | 班级名称 |
1001 | 张三 | 001 | 一年一班 |
1002 | 李四 | 002 | 一年二班 |
1003 | 王五 | 003 | 一年三班 |
1004 | 刘六 | 003 | 一年三班 |
上表满足第一范式吗?
有主键,满足。
满足第二范式吗?
没有复合主键,没有产生部份依赖,满足。
满足第三范式吗?
不满足,一年一班依赖001,一年二班依赖002,产生了传递依赖。
应该修改为两张表:
表一,班级表,班级编号为主键
班级编号(PK) | 班级名称 |
001 | 一年一班 |
002 | 一年二班 |
003 | 一年三班 |
表二,学生班级表,学生编号为主键,班级编号为外键(FK)
学生编号(PK) | 学生姓名 | 班级编号(FK) |
1001 | 张三 | 001 |
1002 | 李四 | 002 |
1003 | 王五 | 003 |
1004 | 刘六 | 003 |
总结:
1.对于多对多关系的表(第二个例子,老师和学生多对多关系),采用三张表,一张A物属性表,一张B物属性表,一张A和B的对应关系表(使用外键连接)
2.对于一对多关系的表(第三个例子,学生和班级多对一关系),采用两张表,一张A物属性表,一张B物属性及A和B的对应关系表(使用外键连接)