基础知识:
候选码:唯一的标识一个实体的属性。它的属性(就是其中的每一个属性)称为主属性。
详细的定义:如果关系中的某一属性组的值能唯一地标识一个元祖,则称该属性组为候选码;
主属性:就是候选码中的属性;
主码:选择其中一个作为主码,就是数据库表中的主键。
超码:大于等于候选码的属性集合(字段集合)。
-----------以下转载自https://www.zhihu.com/question/24696366/answer/29189700
1NF:如果一个关系模式R的所有属性都是不可分的基本数据项
存在问题:数据冗余、插入异常、删除异常、修改异常(这个不解释)
2NF:∈1NF,且每一个非主属性完全函数依赖于任何一个候选码
如果一个模式不属于2NF,就会产生以下几个问题:
1、 插入异常:部分值为空,不能插入
2、 删除异常:不应删除的信息也删除了(同一记录中)
3、 修改复杂:数据冗余大,造成修改的复杂化
- 每一名学生的学号、姓名、系名、系主任这些数据重复多次。每个系与对应的系主任的数据也重复多次——数据冗余过大
- 假如学校新建了一个系,但是暂时还没有招收任何学生(比如3月份就新建了,但要等到8月份才招生),那么是无法将系名与系主任的数据单独地添加到数据表中去的 (注1)——插入异常
注1:根据三种关系完整性约束中实体完整性的要求,关系中的码(注2)所包含的任意一个属性都不能为空,所有属性的组合也不能重复。为了满足此要求,图中的表,只能将学号与课名的组合作为码,否则就无法唯一地区分每一条记录。
注2:码:关系中的某个属性或者某几个属性的组合,用于区分每个元组(可以把“元组”理解为一张表中的每条记录,也就是每一行)。 - 假如将某个系中所有学生相关的记录都删除,那么所有系与系主任的数据也就随之消失了(一个系所有学生都没有了,并不表示这个系就没有了)。——删除异常
- 假如李小明转系到法律系,那么为了保证数据库中数据的一致性,需要修改三条记录中系与系主任的数据。——修改异常。
3NF:∈2NF,且每一个非主属性不传递依赖于码
还是存在插入异常、删除异常、修改异常的情况!!(仓库的例子)
链接:https://www.zhihu.com/question/24696366/answer/29189700
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
- 某公司有若干个仓库;
- 每个仓库只能有一名管理员,一名管理员只能在一个仓库中工作;
- 一个仓库中可以存放多种物品,一种物品也可以存放在不同的仓库中。每种物品在每个仓库中都有对应的数量。
那么关系模式 仓库(仓库名,管理员,物品名,数量) 属于哪一级范式?
答:已知函数依赖集:仓库名 → 管理员,管理员 → 仓库名,(仓库名,物品名)→ 数量
码:(管理员,物品名),(仓库名,物品名)
主属性:仓库名、管理员、物品名
非主属性:数量
∵ 不存在非主属性对码的部分函数依赖和传递函数依赖。∴ 此关系模式属于3NF。
<img src="https://i-blog.csdnimg.cn/blog_migrate/5808cd7d3379f7017463d4082781726e.png" data-rawwidth="625" data-rawheight="296" class="origin_image zh-lightbox-thumb" width="625" data-original="https://pic3.zhimg.com/68d080d437732aad8cfe451b427849d6_r.jpg">
好,既然此关系模式已经属于了 3NF,那么这个关系模式是否存在问题呢?我们来看以下几种操作:
- 先新增加一个仓库,但尚未存放任何物品,是否可以为该仓库指派管理员?——不可以,因为物品名也是主属性,根据实体完整性的要求,主属性不能为空。
- 某仓库被清空后,需要删除所有与这个仓库相关的物品存放记录,会带来什么问题?——仓库本身与管理员的信息也被随之删除了。
- 如果某仓库更换了管理员,会带来什么问题?——这个仓库有几条物品存放记录,就要修改多少次管理员信息。
链接:https://www.zhihu.com/question/24696366/answer/29189700
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
---------------------
BCNF:∈3NF,每一个决定因素都包含码
解决了数据冗余、插入异常、删除异常、修改异常问题
定义:关系模式R<U,F>∈1FNF,若X→Y且Y不是X的子集时X必含有码,则R<U,F>∈BCNF。也就是说,关系模式R<U,F>中,若每一个决定因素都包含码,则R<U,F>∈BCNF。若一个关系达到了第三范式,并且它只有一个候选码,或者它的每个候选码都是单属性,则该关系自然达到BC范式。
通俗的解释就是:主属性不依赖于主属性
比如上面的仓库:
主属性:仓库名、管理员、物品名
仓库名 → 管理员,管理员 → 仓库名
所以并不属于BCNF。