数据库设计 三大范式举例说明

1、兵马未动,粮草先行

要设计出合理的关系型数据库,就需要遵循一些规范。这些不同的规范要求被称为不同的范式,各种范式呈递次规范,要遵循后面的规范先要遵循前面的规范,越高的范式数据库冗余越小。这里只讨论前三种范式,分别是第一范式(1NF)、第二范式(2NF)和第三范式(3NF)。
NF是normal form 的缩写。
:如果在一张表中,一个属性或属性组,被其他所有属性所完全依赖,则称这个属性(或属性组)为该表的码(也就是通常所说的键)。
函数依赖:A—>B,如果根据B属性(或属性组)的值,可以唯一确定A属性的值。则称A依赖于B。例如:学生name—> 学生id,即根据学生id可以唯一确定学生姓名;课程score—> (学生id,课程id),即根据学生id和课程id可以唯一确定某学生的某课程的分数。
完全函数依赖:A—>B, 如果B是一个属性组,则A属性值的确定需要依赖于B属性组中所有的属性值。例如:课程score—> (学生id,课程id),即只有学生id和课程id都确定了,才能唯一确定某学生的某课程的分数,缺一不可。
部分函数依赖:A—>B, 如果B是一个属性组,则A属性值得确定只需要依赖于B属性组中某一些值即可。例如:学生name—> (学生id,课程id),即只需要学生id就可以唯一确定学生姓名。
传递函数依赖:A—>B, B —>C . 如果通过B属性(或属性组)的值,可以唯一确定A属性的值,在通过C属性(属性组)的值可以确定唯一B属性的值,则称 A 传递函数依赖于C。例如:院系id—> 学生id,院系name—> 院系id。即根据学生id可以确定其所在院系id,再根据院系id可以确定院系名称,也就是根据学生id可以唯一确定其所在院系名称。

2、排兵布阵

探马来报,敌方来势汹汹信息如下。
表1

学生id学生姓名院系信息课程信息
10001郭靖1,机械系101,计算机基础,60分
10001郭靖1,机械系102,大学数学,60分
10002黄蓉2,经管系101,计算机基础,80分
10002黄蓉2,经管系102,大学数学,99分
10003杨过3,外语系101,计算机基础,80分
10003杨过3,外语系102,大学数学,90分
10004小龙女4,艺术系101,计算机基础,99分
10004小龙女4,艺术系102,大学数学,70分
10005令狐冲4,艺术系101,计算机基础,50分
10005令狐冲4,艺术系102,大学数学,50分

羽扇纶巾,休要惊慌。
第一阵:名叫第一范式(1NF),即每一列都是不可再分割的原子数据项。院系信息和课程信息都不符合。
表2

学生id学生姓名院系id院系名称课程id课程名称课程分数
10001郭靖1机械系101计算机基础60
10001郭靖1机械系102大学数学60
10002黄蓉2经管系101计算机基础80
10002黄蓉2经管系102大学数学99
10003杨过3外语系101计算机基础80
10003杨过3外语系102大学数学90
10004小龙女4艺术系101计算机基础99
10004小龙女4艺术系102大学数学70
10005令狐冲4艺术系101计算机基础50
10005令狐冲4艺术系102大学数学50

第二阵:名叫第二范式(2NF),即非码属性必须完全依赖于码(消除非主键对主键的部分函数依赖)。表2的码为属性组(学生id,课程id),其中课程score完全依赖于这个属性组,但学生name和院系name并不完全依赖于它。所以分拆如下表3和表4。
表3

学生id课程id课程名称课程分数
10001101计算机基础60
10001102大学数学60
10002101计算机基础80
10002102大学数学99
10003101计算机基础80
10003102大学数学90
10004101计算机基础99
10004102大学数学70
10005101计算机基础99
10005102大学数学70

表4

学生id学生姓名院系id院系名称
10001郭靖1机械系
10002黄蓉2经管系
10003杨过3外语系
10004小龙女4艺术系
10005令狐冲4艺术系

对表3再次使用第二范式,课程score完全依赖于属性组(学生id和课程id),但课程name并不完全依赖于它。所以分拆如下表5和表6。
表5 学生课程分数表

学生id课程id课程分数
1000110160
1000110260
1000210180
1000210299
1000310180
1000310290
1000410199
1000410270
1000510150
1000510250

表6 课程表

课程id课程名称
101计算机基础
102大学数学

第三阵:叫做第三范式,即任何非主属性不依赖于其它非主属性(消除传递依赖)。看表4,这里学生id是主属性。院系id依赖于学生id,院系名称是一个非主属性,院系id也是一个非主属性,而院系名称又依赖于院系id 。所以,表4拆分为如下表7和表8。
表7 学生表

学生id学生姓名院系id
10001郭靖1
10002黄蓉2
10003杨过3
10004小龙女4
10005令狐冲4

表8 院系表

院系id院系名称
1机械系
2经管系
3外语系
4艺术系

至此,表1已被完全分解为表5、表6、表7和表8,完全符合三大范式,是设计的比较合理的表。

3、打扫战场

表1被分解为表5、表6、表7和表8的过程,是符合三大范式的,其总的思想无外乎明确一件事,即每个表都只保存一类事物,这正符合了数据库表和Java中的实体类的ORM(Object Relational Mapping 对象关系映射)思想。

表1的形式结果可能更多用于在应用客户端展示信息时使用。

仍要注意,按照三大范式设计表理论上是可行的,这也大大减少了数据库中数据的冗余。但切不可固步自封,在实际开发业务场景中,有时候为了方便信息的获取与展示,有时可能还需要故意增加个别冗余字段来达到目的。因此,最终的表结构仍要根据具体问题具体分析具体设计。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值