用 DBMS 中的示例解释 2NF
在 2NF 中,关系必须符合 1NF。在第二范式中,所有非键属性都完全依赖于主键。或者,当关系符合 1NF 且不存在部分依赖关系时,它符合 2NF。
示例
考虑一个关系 R (rollno, name, subjectcode, subjectname, duration)
| Rollno | Name | Subjectcode | Subjectname | Duration |
|---|---|---|---|---|
| 1 | Hari | S1 | C | 60 days |
| 1 | Hari | S2 | Java | 90 days |
| 2 | Pinky | S1 | C | 60 days |
| 2 | Pinky | S2 | Java | 90 days |
| 3 | Rakhi | S3 | Database | 45 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
| Rollno | Name |
|---|---|
| 1 | Hari |
| 2 | Pinky |
| 3 | rakhi |
R3
| Subjectcode | Subjectname | Duration |
|---|---|---|
| S1 | C | 60 days |
| S2 | Java | 90 days |
| S3 | Database | 45 days |
R4
| Rollno | subjectcode |
|---|---|
| 1 | S1 |
| 1 | S2 |
| 2 | S1 |
| 2 | S2 |
| 3 | S3 |
以上三个表没有任何异常。让我们仔细看看为什么没有异常。
无插入异常:现在可以将新课程"php"插入到科目表中,而无需任何学生信息。
无删除异常:如果我们从 R1 和 R4 中删除 rakhi 记录,则不会有任何影响。因为科目表中的"数据库"未受影响。
无更新异常:要更改任何科目,只需在科目表中进行一次更改即可。

