数据库的几个范式

本文深入探讨数据库规范化过程中的1NF、2NF、3NF和BCNF,并通过实例详细阐述了各阶段的问题与解决方案,旨在提升数据库设计的效率与稳定性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 1NF

实体的属性是不可再分的数据项。

2. 2NF

满足1NF且每一个非主属性完全依赖于码。

比如说:

学生(学号,所在系, 住址,课程号,成绩),约定为每个系的学生住同一个地方。

这里码为(学号, 课程号),函数依赖有:

(学号, 课程号) --> 成绩 【完全依赖】
(学号) --> 所在系, (学号, 课程号) --> 所在系 【部分依赖】
(学号) --> 住址, (学号, 课程号) --> 住址 【部分依赖】

这个关系部属于2NF,就会产生以下几个问题:
(1) 插入异常。假如插入一个学生:学号=001, 所在系="计算机, 住址="成都",但该学生还没选课,
即这个学生没有课程号,所以无法插入数据库。因为码值是(学号,课程号),课程号为空,所以学生
固有信息无法插入。

(2) 删除异常。如果删除一门课程,学生的固有信息也被删除了,造成删除异常。

(3) 修改复杂。 如果学生从计算机系转入到数学系,则除了修改所在系信息,还要修改住处。因为
对该关系来说,学生转系时住处也会相应改变。另外,如果学生选修了k门课程,则该学生系和
住址重复存储了k次,造成修改的复杂化。

所以,该关系要重新拆分,拆分如下:
(学号,课程号,成绩)
(学号,所在系,住址)

3. 3NF

满足2NF且每一个非主属性既不部门依赖于码也不传递依赖于码。

比如:在(学号,所在系,住址)关系中:
学号->所在系
学号->住址
所在系->住址 (因为约定每个系的学生住同一个地方)

所以该关系有传递依赖。所以要重新拆分:
(学号,所在系)
(所在系,住址)

4. BCNF

满足3NF且每一个决定因素都包含码。有三层意思
(1) 所有的非主属性对每一个码都是完全函数依赖。
(2) 所有的主属性对每一个不包含它的码,也是完全函数依赖。
(3) 没有任何属性会完全依赖于非码的任何一组属性。

比如:
S(学号,姓名,所在系,年龄)
假定姓名也具有唯一性,那么S就有两个码,这两个码由单个属性组成,彼此不相交。其他属性不存在对码的部分依赖于传递依赖,
所以属于3NF,同时,S中除学号外,姓名并没有其他决定因素,所以S也属于BCNF。

在比如:
C(课程号,课程名称,课时)
C只有一个码,且课程号是唯一的决定因素,没有任何属性对课程号部分依赖或传递依赖,所以C属于BCNF。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值