用 DBMS 中的示例解释 2NF

dbmsdatabasebig data analytics更新于 2026/1/13 15:22:17

在 2NF 中,关系必须符合 1NF。在第二范式中,所有非键属性都完全依赖于主键。或者,当关系符合 1NF 且不存在部分依赖关系时,它符合 2NF。

示例

考虑一个关系 R (rollno, name, subjectcode, subjectname, duration)

RollnoNameSubjectcodeSubjectnameDuration
1HariS1C60 days
1HariS2Java90 days
2PinkyS1C60 days
2PinkyS2Java90 days
3RakhiS3Database45 days

F: {rollno -> name, subjectcode -> (subjectname, duration).

{rollno, subjectcode}+ = {rollno, name, subjectcode, subjectname, duration

=> {rollno, subjectcode } 为候选键。

上表符合第一范式 (1NF),因为不存在多值属性。但它不符合 2NF,因为存在以下两个部分依赖关系。

Rollno->name 是部分依赖关系 {因为 name 依赖于 key 的一部分}

Subjectcode->{subjectname, duration} {因为 subjectname 和 duration 依赖于 key 的一部分}

异常

该表还存在三个异常,如下所示 −

  • 插入异常 − 除非有学生必须选修该课程,否则我们无法在表中插入新课程,例如"PHP"。

  • 更新异常 −如果我们将主题从 C 更改为 C++,则必须在多个位置进行更改,否则表格将不一致。

  • 删除异常 − 如果从表中删除 Rakhi,我们也会丢失有关"数据库"主题的信息。

要将给定表转换为 2NF,我们需要先分解该表。

2NF 分解 − 为了克服这些异常,应将表 R 划分为更小的表。

如果部分依赖关系为 X->Y,则将 R 划分为 R1(X+) 和 R2(R-Y+)

Rollno-> rollno+ = {rollno, name}

R2 =R-name+ = {rollno, subjectcode, subjectname, duration} 

Subjectcode -> {subjectname, duration} 是部分依赖关系(因为 subjectname 和 duration 依赖于部分键值)。

因此,将 R2 表划分到 R3 和 R4 上,减去

R3=subjectcode+= {subjectcode, subjectname, duration}

R4= R2- {subjectname, duration}+ = {rollno, subjectcode}。

其图示如下: −

R1

RollnoName
1Hari
2Pinky
3rakhi

R3

SubjectcodeSubjectnameDuration
S1C60 days
S2Java90 days
S3Database45 days

R4

Rollnosubjectcode
1S1
1S2
2S1
2S2
3S3

以上三个表没有任何异常。让我们仔细看看为什么没有异常。

  • 无插入异常:现在可以将新课程"php"插入到科目表中,而无需任何学生信息。

  • 无删除异常:如果我们从 R1 和 R4 中删除 rakhi 记录,则不会有任何影响。因为科目表中的"数据库"未受影响。

  • 无更新异常:要更改任何科目,只需在科目表中进行一次更改即可。


相关文章