37 数据库设计三范式(重点内容:面试经常问)
37 数据库设计三范式(重点内容:面试经常问)
什么是设计范式?
设计表的依据,按照这个三范式设计的表不会出现数据冗余。
三范式都是哪些?
第一范式:任何一张表都应该有主键。并且每一个字段原子性不可再分。
第二范式:建立在第一范式的基础之上,所有非主键字段完全依赖主键,不能产生部分依赖。
***** 多对多?三张表,关系表中有两个外键。
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
提醒:在实际的开发中,以满足客户的需求为主,有的时候会拿冗余换执行速度。
一对一怎么设计?
一对一设计有两种方案:主键共享
t_user_login 用户登录表
id(pk) username password
---------------------------------
1 zs 123
2 ls 456
t_user_detail 用户详细信息表
id(pk+fk) realname tel ...
-------------------------------
zs 1111
ls 2222
一对一设计有两种方案:外键唯一
t_user_login 用户登录表
id(pk) username password
---------------------------------
1 zs 123
2 ls 456
t_user_detail 用户详细信息表
id(pk) realname tel userid(fk+unique)...
-------------------------------
1 zs 1111 1
2 ls 2222 2