什么是三范式
设计表的依据,按照这个三范式设计的表不会出现数据冗余。
三范式有哪些
第一范式:
任何一张表都应该有主键,每个字段原子性不可再分
第二范式:
建立在第一范式的基础上,所有非主键字段完全依赖主键,不能产生部分依赖
多对多?三张表,关系表两个外键。
t_student学生表
sno(pk) | sname |
---|---|
1 | 张三 |
2 | 李四 |
3 | 王五 |
t_teacher 讲师表
tno(pk) | tname |
---|---|
1 | 王老师 |
2 | 张老师 |
3 | 李老师 |
t_student_teacher_relation 学生讲师关系表
id(pk) | sno(fk) | tno(fk) |
---|---|---|
1 | 1 | 3 |
2 | 1 | 1 |
3 | 2 | 2 |
4 | 2 | 3 |
5 | 3 | 1 |
6 | 3 | 3 |
第三范式:建立在第二范式的基础之上,所有非主键字段直接依赖主键,不能产生传递依赖。
一对多?两张表,多的表加外键。
班级 t_class
cno(pk) | cname |
---|---|
1 | 班级1 |
2 | 班级2 |
学生 t_student
sno(pk) | sname | classno(fk) |
---|---|---|
101 | 张1 | 1 |
102 | 张2 | 1 |
103 | 张3 | 2 |
104 | 张4 | 2 |
105 | 张5 | 2 |
TIP
在实际的开发中,以满足客户的需求为主,有的时候会拿冗余换执行速度。
一对一的表设计
一对一设计有两种方案:主键共享
t_user_login 用户登录表
id(pk) | username | password |
---|---|---|
1 | zs | 123 |
2 | ls | 456 |
t_user_detail 用户详细信息表
id(pk+fk) | realname | tel | ... |
---|---|---|---|
1 | 张三 | 1111111111 | |
2 | 李四 | 1111415621 |
一对一设计有两种方案:外键唯一。
t_user_login 用户登录表
id(pk) | username | password |
---|---|---|
1 | zs | 123 |
2 | ls | 345 |
t_user_detail 用户详细信息表
id(pk) | realname | tel | userid(fk+unique).... |
---|---|---|---|
1 | 张三 | 1111111111 | 2 |
2 | 李四 | 1111415621 | 1 |