Mysql系列——数据库设计(3)——数据库设计的三大范式:详细

在大学学习数据库的时候,不明白为什么会学习很多关系代数、设计范式的理论。但是,有了这些理论基础,在遇到问题的时候脑袋会有灵光一闪的感觉。那种感觉很像是大雾天太阳照射大地的感觉,心中一片光亮。^_^

那么,范式是什么呢?
课本中的定义:范式是“符合某一种级别的关系模式的集合,表示一个关系内部各属性之间的联系的合理化程度”。–《数据库理论》
通俗的讲,他是一套成型的设计原则,照着这种原则设计数据库能够少走弯路。

接下来,简单的介绍下三个范式。

One

1NF的定义为:符合1NF的关系中的每个属性都不可再分。下表所示的情况,就不符合1NF的要求。

这里写图片描述:引用自知乎

同样的,下表中也不符合1NF:

用户id用户名所属角色id
1user12,5,9

一般来说上边的用户表的方式较为常见,我在刚毕业编程的时候,曾经有朋友交给我这种方式,也让我吃了一些苦头。
下表符合第一范式:

编号品名进货数量进货单价销售数量销售单价备注

用户表:

用户id用户名
1user1

用户角色关系表

用户id角色id
12
15
19

Two

2NF在1NF的基础之上,消除了非主属性对于码的部分函数依赖。
函数依赖:
我们可以这么理解(但并不是特别严格的定义):若在一张表中,在属性(或属性组)X的值确定的情况下,必定能确定属性Y的值,那么就可以说Y函数依赖于X,写作 X → Y。
码:能够确定表中所有其他字段值的字段或者字段组合。
对于下表中的数据,找不到任何一条记录,它们的学号相同而对应的姓名不同。所以我们可以说姓名函数依赖于学号,写作 学号 → 姓名。但是,其中(学号,课程)->分数,就是说学号跟课程才能确定分数。
因此我们首先选取表中的码。就是通过表中所有属性的依赖关系(决定关系)来确定码。
学号->姓名
学号->系名
学号,课程->分数
因此,能够决定所有其他属性的字段或者字段组合是(学号,课程)字段组合,选取该组合为码。
那么,对于码(学号,课程)来说,学号,课程->姓名属于部分函数依赖,因为码(学号,课程)的部分属性学号就能确定姓名这个属性。

学号姓名系名课程分数
002001王明地理信息学院大学数学95
002001王明地理信息学院大学英语92
002003张芳地理信息学院计算机基础96

因此上表不能满足第二范式,如果不能满足范式,可以通过拆表来解决:

学号姓名系名
002001王明地理信息学院

学号->姓名
学号->系名

学号课程分数
002001大学数学95
002001大学英语92

学号,课程->分数
那么现在上表满足第二范式了,仍然不满足第三范式。试想下,如果该系更名,那么就需要修改学生表中的所有系名。请看:数据库三大范式-引出

用数据库的专业属于,学号-> 系名属于传递依赖,因为学号->系编号 ->系名。

由此引出第三范式:

Three

第三范式(3NF) 3NF在2NF的基础之上,消除了非主属性对于码的传递函数依赖。
那么下表中,学号->系名属于传递依赖,不满足第三范式。

学号姓名系名
002001王明地理信息学院

同样,如果某个表不满足第三范式,通过拆表来解决。将传递依赖进行拆除,放到新的表中。
如下:

学号姓名系编号
002001王明002
系编号系名
002地理信息学院

那么为什么,我们将系编号添置在学生表中作为一个属性,而不像下面两张表一样再写一个关系表呢?

学号系编号
002001002
学号姓名
002001王明

因为学生:学院 之间是1:M,就是说是1对多的关系。如果您对实体表之间的关系感兴趣,请看下一节。

由于,博客增加了一些内容,因此进行了延期。对此,明义经典感到很抱歉。亲,请见谅啊。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值