(8)MySQL数据库设计三范式

什么是数据库的设计范式

数据库表的设计依据也就是范式

第一范式

要求任何一张表都必须有主键,每一个字段原子性不可分

思考:下面这张表是否属于第一范式?

学生编号学生姓名联系方式
1001张三zs@qq,com,1231232131
1002李四ls@qq.com,3213123123
1001王五ww@qq,com,3231231313

答:不属于,因为没有主键,且联系方式原子性可再分为邮箱和电话

修改之后的表格如下所示才满足第一范式

学生编号(primary key)学生姓名邮箱地址联系电话
1001张三zs@qq,com1231232131
1002李四ls@qq.com3213123123
1003王五ww@qq,com3231231313

第二范式

建立在第一范式的基础上,要求所有非主键字段完全依赖主键,不要产生部分依赖

学生编号学生姓名教师编号教师姓名
1001张三001王老师
1002李四002赵老师
1003王五001王老师
1001张三002赵老师

学生老师关系是多对多的关系,一个老师可以对应一个学生,一个学生可以对应一个老师

上面学生老师表不满足第一范式,因为没有主键,此时没有可以使用复合主键,学生编号+教师编号(primary key)

但是,这个时候学习姓名部分依赖主键里面的学生编号,教师姓名部分依赖主键里面的教师编号,不满足第二范式。此时可以拆分成三张表学生表,教师表,关系表

t_student

学生编号(primary key)学生姓名
1001张三
1002李四
1003王五

t_teacher

教师编号(primary key)教师姓名
001王老师
002赵老师

t_student_teacher_relation

id(primary key)学生编号(foreign key)教师编号(foreign key)
11001001
21002002
31003001
41001002

第三范式

建立在第二范式的基础上,要求所有非主键字段直接依赖主键,不要产生传递依赖

学生编号(primary key)学生姓名班级编号班级名称
1001张三01一年一班
1002李四02一年二班
1003王五03一年三班
1004赵六03一年三班

学生与班级的关系是1对多的关系,一个学生属于一个班级,一个班级里有许多学生

有主键,原子性不可分,满足第一范式

对主键都是完全依赖,满足第二范式

班级名称依赖班级编号,班级编号再依赖学习编号(primary key),班级名称传递依赖于主键,因此不满足第三范式

需要将1对多的表拆分成2张表

t_class

班级编号(primary key)班级名称
01一年一班
02一年二班
03一年三班

t_student

学生编号(primary key)学习姓名班级编号(foreign key)
1001张三01
1002李四02
1003王五03
1004赵六03

数据库设计范式的作用

避免表中数据的冗余,空间的浪费

总结表的设计

1对多

原则:拆分成两张表,多的部分表加外键,如学生班级表拆分,学生为多,班级为1,因此学生表加外键

多对多

原则:拆分成三张表,关系表加两个外键

1对1

原则:拆分成多个表,加外键,外键要唯一

当表的字段比较多时,需要将表拆分

id(primary key)login_namereal_namelogin_passwordemail
1TXzhangsan张三123456zx@qq.com
2TXlisi李四123456ls@qq.com
3TXwangwu王五123456ww@qq.com

拆分成两张表

t_login

主键尽量使用自然主键,不要使用login_name业务主键

login_id(primary key)login_namelogin_password
1TXzhangsan123456
2TXlisi123456
3TXwangwu123456

t_user

id(primary key)real_nameemaillogin_id(foreign key + unique)
1张三zs@qq.com1
2李四ls@qq.com2
3王五ww@qq.com3
现实与实际

数据库三范式是理论上的,实际开发时,多表连接查询是会影响效率的,表连接越多效率相对越低,开发时需要在空间和效率两者中进行选择。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LiuJie_Boom

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值