数据库三范式详解

数据库三范式详解

什么是数据库范式

     设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。

一范式

     数据库表中的所有字段值都是不可分解的原子值。[字段原子性,不可分]

例:学生表

学生编号学生姓名联系方式
1张三1@qq.com
2李四12354534463
3王五12351255612

     在这个学生表中联系方式可分为多种,不满足一范式中的所有字段值是不可分解的原子值。

     下面对此表进行修改使其满足一范式:

学生编号学生姓名邮箱电话
1张三1@qq.com12353466737
2李四2@qq.com12354534463
3王五3@qq.com12351255612

二范式

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

例:学生表

     这张表描述了学生和老师的关系(多对多)

学生编号学生姓名老师编号老师姓名
1张三01张老师
2李四02王老师
3王五01张老师

     此时没有主键,不满足二范式,做出如下修改

(学生编号老师编号)(pk)学生姓名老师姓名
101张三张老师
202李四王老师
301王五张老师

     此时我们将学生编号与老师编号设为复合主键,此时学生姓名依赖学生编号,老师姓名依赖老师编号,不满足二范式中非主键字段完全依赖主键。会造成数据的冗余。此时为了让此表满足二范式,可以使用三张表来表示此表的多对多关系。

     即:学生表;教师表;学生教师关系表 如下

学生表

学生编号学生姓名
1张三
2李四
3王五

教师表

老师编号老师姓名
01张老师
02王老师

关系表

id(pk)学生编号(fk)老师编号(fk)
1101
2202
2301

     此时表满足二范式。

多对多怎么设计:三张表,关系表两个外键!


三范式

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

例:学生表

学生编号(pk)学生姓名班级编号班级名称
1张三01一班
2李四02二班
3王五01一班

     以上表描述了班级和学生关系,显然为一对多关系(一个教室中有多个学生)

     分析此表满足一范式。

     因为不是复合主键,没有产生部份依赖,主键是单一主键 ,满足第二范式。

     分析第三范式要求,不要产生传递依赖,但是在此表之中,一班依赖于班级编号01,班级编号01依赖于主键1,产生传递依赖,不满足三范式,下面对此表进行改进:

     面对一对多表的设计可以将表拆分为两个一个学生表,一个班级表如下所示:

学生表:

学生编号(pk)学生姓名班级编号(fk)
1张三01
2李四02
3王五01

班级表:

班级编号(pk)班级名称
01一班
02二班
     此时此表满足三范式

一对多,两张表,多的表加外键!
     实践和理论上存在些许偏差,最终目的都是要完成客户需求,有的时候我们会拿冗余换取速度(sql中表和表之间的连接次数越多,效率越低)
     有的时候虽然会存在数据冗余,但是为了减少连接次数,这样做也是合理的,并且利于开发人员sql语句编写难度也会降低。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值