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

 

前言

       数据库课本上都把范式写到五范式了,但是实际应用中,满足三范式已经足够了,五范式太多余了。

三种范式是条件递增的联系(即后一个范式是在前一个条件满足的情况下引入新的条件)。

 

例如

 范式

满足条件

一范式(1NF)

条件a

二范式(2NF)

条件a,条件b

三范式(3NF)

条件a,条件b,条件c

 

下面详细解释一下

 

第一范式(1nf)

满足条件:

  1. 原子性,即数据库表里的字段都是不可分割的

 

例如下面学生表的设计明显不满足要求,年级专业是可以再分的,就不能偷懒放在一块

学号

姓名

年龄

年级专业

201511216776

王玉伟

20

15级软工

 

符合第一范式的做法为

学号

姓名

年龄

年级

专业

201511216776

王玉伟

20

15级

软工

 

第二范式(2nf)

满足条件:

  1. 原子性,即数据库表里的字段都是不可分割的
  2. 表中必须有主键
  3. 其他非主属性必须完全依赖主键(不能依赖主键一部分,这是针对联合主键说的)

 

针对条件三解释一下(假设学号为主键)

    我们以学号为主键的时候,确保该学生别的字段都完全依赖学号,不能出现下面这种课程名不依赖学号而依赖课程号的设计。

学号

姓名

年龄

课程名

课程号

201511216776

王玉伟

20

英语

20003

 

符合第二范式的做法

学号

姓名

年龄

201511216776

王玉伟

20

课程名

课程号

英语

20003

 

解释一下联合主键中的要求

       下面是我之前设计的一个表,学号sno与课程号cno做联合主键,而第二范式要求的完全依赖,下表并没有做到从这个表中可以看出,姓名依赖学号,课程名依赖课程号,但是这都是依赖了一部分,只有成绩对学号和课程号都依赖,因此是不符合第二范式的

 

 

符合第二范式的设计为(即拆成三个表,只展示一下表的字段)

Sno

Cno

grade

Cno

cname

Sno

sname

 

第三范式(3nf)

满足条件:

  1. 原子性,即数据库表里的字段都是不可分割的
  2. 表中必须有主键
  3. 其他非主属性必须完全依赖主键(不能依赖主键一部分,这是针对联合主键说的)
  4. 非表中主键字段完全直接依赖主键,不能是传递依赖

 

例如下表,学院依赖于主键学号,但是学院地址 依赖于学院,这样对主键就是不是直接依赖(这里可能会有人疑问地址也是能拆成省市区的字段,这里不拆也是可以的,因为表示的就是地址字段)

学号

姓名

年龄

年级

学院

学院地址

201511216776

王玉伟

20

15级

计算机学院

内蒙古呼和浩特市赛罕区

 

符合第三范式的做法(删去有间接依赖的字段)

学号

姓名

年龄

年级

学院

201511216776

王玉伟

20

15级

计算机学院

 

评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值