若关系R的候选码都是由单属性构成的,则R的最高范式必定是( B )。
A. 1NF
B. 2NF
C. 3NF
D.无法确定
为什么是2NF的
先温习基础知识:
若关系中的一个属性或属性组的值能够唯一地标识一个元组,且他的真子集不能唯一的标识一个元组,则称这个属性或属性组做候选码。
若一个关系有多个候选码,则选定其中一个为主码。
1NF:确保每个属性都是原子性的,即不可再分。一个属性中不能包含另一个属性的集合,例如一个地址属性中不能包含街道、城市、国家等属性。
2NF:在满足1NF的基础上,每个非主属性完全依赖于主键,而不是只依赖于主键的一部分。如果主键是由多个属性组成的复合键,那么非主属性就要依赖于所有的主键属性,而不是只依赖于其中一部分。
3NF:在满足2NF的基础上,每个非主属性不依赖于其他非主属性。换句话说,每个非主属性都必须直接依赖于主键。如果存在非主属性之间的依赖关系,就要把它们拆分成单独的表,每个表都应该有自己的主键。
下面分析选项:
R是一个关系,关系型数据库的关系必然满足1NF,即每个属性都是原子的,而不是复合的。
在R满足1NF的基础上,由于关系R的候选码都是由单属性构成的,因此即便存在非主码属性依赖于主码属性,那也只能完全依赖于主码,而不能部分依赖于主码,因此R满足2NF。
“关系R的候选码都是由单属性构成的”不能保证关系R的每个非主属性不依赖于其他非主属性。如果R的非主属性之间存在传递依赖关系,即存在一个非主属性A,它依赖于R的主属性,而另一个非主属性B又依赖于A,则R就不满足3NF。这时候就需要对R进行分解,使得新关系集合能够保持函数依赖关系,同时保持数据的一致性和完整性。因此,关系R不满足3NF。
因此,关系R最高必然满足2NF,不一定满足3NF,所以选B。
如果我的回答对你有帮助,还望采纳。
学生 课程 老师 老师职称 教材 教室 上课时间 |
小明 一年级语文(上) 大宝 副教授 《小学语文1》 101 14:30 |
一个学生上一门课,一定在特定某个教室。所以有(学生,课程)->教室
一个学生上一门课,一定是特定某个老师教。所以有(学生,课程)->老师
一个学生上一门课,他老师的职称可以确定。所以有(学生,课程)->老师职称
一个学生上一门课,一定是特定某个教材。所以有(学生,课程)->教材
一个学生上一门课,一定在特定时间。所以有(学生,课程)->上课时间
因此(学生,课程)是一个码。
然而,一个课程,一定指定了某个教材,一年级语文肯定用的是《小学语文1》,那么就有课程->教材。(学生,课程)是个码,
课程却决定了教材,这就叫做不完全依赖,或者说部分依赖。出现这样的情况,就不满足第二范式 !有什么不好吗?你可以想想:
校长要新增加一门课程叫“微积分”,教材是《大学数学》,怎么办?学生还没选课,而学生又是主属性,主属性不能空,课程怎么记录呢,教材记到哪呢? ……郁闷了吧?(插入异常)
下学期没学生学一年级语文(上)了,学一年级语文(下)去了,那么表中将不存在一年级语文(上),也就没了《小学语文1》。这时候,校长问:一年级语文(上)用的什么教材啊?……郁闷了吧?(删除异常)
校长说:一年级语文(上)换教材,换成《大学语文》。有10000个学生选了这么课,改动好大啊!改累死了……郁闷了吧?(修改异常)
那应该怎么解决呢?们必须消除这些部分函数依赖,只有一个办法,就是将大数据表拆分成两个或者更多个更小的数据表,在拆分的过程中,要达到更高一级范式的要求,这个过程叫做”模式分解“。模式分解的方法不是唯一的,以下是其中一种方法:将一个表分解成两个或若干个表。
学生表
学生 课程 老师 老师职称 教室 上课时间 |
小明 一年级语文(上) 大宝 副教授 101 14:30 |
课程表
课程 教材 |
一年级语文(上) 《小学语文1》 |
(这里还涉及到一个如何进行模式分解才是正确的知识点,先不介绍了)
现在我们来看一下,进行同样的操作,是否还存在着之前的那些问题?
所以说,仅仅符合2NF的要求,很多情况下还是不够的,而出现问题的原因,在于仍然存在非主属性系主任对于码学号的传递函数依赖。为了能进一步解决这些问题,我们还需要将符合2NF要求的数据表改进为符合3NF的要求。
第三范式(3NF):符合2NF,并且消除了非主属性对于候选码的传递函数依赖。
接下来我们看看上面2NF图中的设计,是否符合3NF的要求。
对于课程表,主码为课程,主属性为课程,非主属性只有一个,为教材,不可能存在传递函数依赖,所以表2的设计,符合3NF的要求。
对于学生表,主码为(学生,课程)
,主属性为学生和课程,非主属性为老师、老师职称和教室。
因为(学生,课程) → 老师,同时老师 → 老师职称
,所以存在非主属性系老师对于码(学生,课程)的传递函数依赖,所以表1的设计,不符合3NF的要求。
为了让数据表设计达到3NF,我们必须进一步进行模式分解为以下形式:
学生表(学生,课程,老师,教室,上课时间)
课程表(课程,教材)
老师表(老师,老师职称)
对于课程表,符合3NF的要求,之前已经分析过了。
对于学生表,码为(学生,课程),主属性为学生和课程,非主属性为老师、教室和上课时间,不可能存在非主属性对于码的传递函数依赖,所以符合3NF的要求。
对于老师表,码为老师,主属性老师,非主属性为老师职称,不可能存在非主属性对于码的传递函数依赖(至少要有三个属性才可能存在传递函数依赖关系),所以符合3NF的要求。
学生表
学生 课程 老师 教室 上课时间 |
小明 一年级语文(上) 大宝 101 14:30 |
课程表
课程 教材 |
一年级语文(上) 《小学语文1》 |
老师表
老师 老师职称 |
大宝 副教授 |
现在我们来看一下,进行同样的操作,是否还存在着之前的那些问题?
BCNF:符合3NF,并且消除主属性对于码的部分与传递函数依赖
存在关系:
书号→书名
(书名、作者)→书号
其中,每一个属性都为主属性,但是上述关系存在传递依赖,不能是BCNF。即:
(书名、作者)→书号→书名
(书名、作者)→书名
即出现主属性书号对(书名,作者)码的传递依赖
我们可以通过分解为两张表,实现BCNF。
答:已知函数依赖集:
仓库名 → 管理员,管理员 → 仓库名,(仓库名,物品名)→ 数量
码:(管理员,物品名),(仓库名,物品名)
主属性:仓库名、管理员、物品名非主属性:数量
∵ 不存在非主属性对码的部分函数依赖和传递函数依赖。
∴ 此关系模式属于3NF。
基于此关系模式的关系(具体的数据)可能如图所示:
好,既然此关系模式已经属于了 3NF,那么这个关系模式是否存在问题呢?我们来看以下几种操作: