7.数据库设计三范式 面试知识
7.1 设计范式:
设计表的依据,按照这个三范式设计的表不会出现数据冗余。
7.2 三范式
第一范式:任何一张表都应该有主键,并且每一个字段原子性不可再分。
第二范式:建立在一范式之上,所有非主键字段完全依赖主键,不能产生部分依赖。
案例:
学生编号(pk) | 老师编号(pk) | 学生姓名 | 老师姓名 |
---|---|---|---|
1001 | 001 | 张三 | 王老师 |
以上表采用复合主键,学生姓名字段和老师姓名字段部分依赖于主键
口诀:多对多,三张表,关系表两个外键。
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
第三范式:建立在第二范式的基础之上,所有非主键字段直接依赖主键,不能产生传递依赖。
第三范式要求数据表的每一列都与主键直接相关,而不是间接相关。
就比如说:
学号 | 姓名 | 性别 | 班主任姓名 | 班主任性别 | 班主任年龄 |
---|---|---|---|---|---|
2001 | 李一 | 男 | 陈毅 | 男 | 35 |
从上表可以看出,所有属性都完全依赖于学号,故符合第三范式,但是班主任性别和班主任年龄直接依赖于班主任姓名,而不是主键学号,故不符合第三范式。
口诀: 一对多,两张表,多的表加外键
班级 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
反三范式
在实际开发中,以满足客户的需求为主,有的时候会拿冗余换执行速度。
7.3 一对一设计
第一种方案:主键共享
t_user_login 用户登录表
id(pk) username password
-------------------------------
1 zs 123
2 ls 456
t_user_detail 用户详细信息表
id(pk+fk) realname tel ...
----------------------------------
1 张三 11111111
2 李四 22222222
弟二种方案:外键唯一
t_user_login 用户登录表
id(pk) username password
-------------------------------
1 zs 123
2 ls 456
t_user_detail 用户详细信息表
id(pk) realname tel userid(fk+unique) ...
------------------------------------------
1 张三 11111111 2
2 李四 22222222 1