什么是三大范式?
设计表的依据:按照三大范式设计的表不会出现数据冗余。
三大范式有哪些?
- 第一范式 :任何表都有一个主键,并且每一个字段的原子性不可再分。
例子:不满足第一范式
学生编号 | 学生姓名 | 联系方式 |
---|---|---|
001 | 王五 | 13222222588,13222222588@qq.com |
002 | 张三 | 13525877852,44521342@qq.com |
001 | 赵六 | 13728854321,12345678@qq.com |
存在的问题
- 最后一条数据和第一条重复(不唯一,没有主键)
- 联系方式可以再分,不是原子性
修正后例子
学生编号 | 学生姓名 | 电话 | 邮箱 |
---|---|---|---|
001 | 王五 | 13222222588 | 13222222588@qq.com |
002 | 张三 | 13525877852 | 44521342@qq.com |
003 | 赵六 | 13728854321 | 12345678@qq.com |
关于第一范式:每一行的必须有唯一主键,这是设计数据库的最基本要求。
- 第二范式:第二范式在第一范式的基础上,所有的非主键字段,完全依赖主键,不能产生部分依赖。容易产生冗余数据
技巧:
多对多 三张表 两个外键
student 学生表
stu_id | stu_name |
---|---|
1 | 张三 |
2 | 李四 |
3 | 王五 |
teacher 教师表
tea_id | teacher_name |
---|---|
1 | 张老师 |
2 | 李老师 |
3 | 王老师 |
中间表 两个外键
id | stu_id | tea_id |
---|---|---|
1 | 2 | 1 |
2 | 2 | 3 |
3 | 1 | 2 |
4 | 3 | 1 |
- 第三范式: 在第二大范式的基础上,所有非主键字段直接依赖主键,不能产生传递依赖。
一vs多
一对多:两张表,多的表加外键
班级表 t_class
cno | cname |
---|---|
1 | 1班 |
1 | 2班 |
学生表 t_student
sno | sname | classno(fk) |
---|---|---|
1 | 张三 | 1 |
2 | 李四 | 2 |
3 | 王五 | 1 |
总结:
设计范式
设计表的依据,按照三范式的表,不会出现数据冗余。
三范式
- 多对多,三张表,加个关系表
- 一对多,两张表,多的表加个外键
提醒:
满足客服的要求,有的通过冗余换取速度
一对一 怎么设计
两种方案
- 主键共享
- 外键唯一,并且新加UNIQUE
例子:user_info表,是一个非常大的表,我们将常用的字段数据拆出来一个新表,方便查询,将不常用的表和常用的表一一对应。
t_user_login 用户登录表
id | username | password |
---|---|---|
1 | zhangsan | 123456 |
2 | wangwu | 123456 |
t_user_detail 用户详情表
id | username | phone | address | t_id(unique) |
---|---|---|---|---|
1 | wangwu | 17625432312 | 北京 | 2 |
2 | zhangsan | 18642365124 | 上海 | 1 |