创建一个符合第一范式 (DBMS) 的示例表
dbmsdatabasebig data analytics更新于 2026/1/13 3:37:17
如果表存在数据冗余且未正确规范化,则处理和更新将非常困难。如果关系包含复合属性或多值属性,则违反第一范式。
如果满足以下条件,则表符合 1Nf 范式 −
- 只有单值属性。
- 属性域不变。
- 每个属性或列都有唯一的名称。
- 数据存储顺序无关紧要。
示例
考虑下表 −
| Id | Name | Course |
|---|---|---|
| 1 | A | C1,C2 |
| 2 | E | C3 |
| 3 | B | C2,C3 |
上表为非规范化形式,课程属性包含多值属性,违反了第一范式 (1NF)。
现在,我们通过为每个课程创建一个新行来表示上表,行号为 −
| Id | Name | Course |
|---|---|---|
| 1 | A | C1 |
| 1 | A | C2 |
| 2 | E | C3 |
| 3 | B | C2 |
| 3 | B | C4 |
由于课程原因,上表包含冗余数据,因为对于每个课程号,我们必须重复所有学生的信息。因此,课程属性应该与上表分开。
我们将上表 R 拆分为两个表,这就是规范化 − 的概念。
R1(键,多值属性),R2(R-多值属性)
=>R1(ID,课程),R2(ID,姓名)。
分解 1NF 表的步骤
将重复组中出现的所有项目放入一个新表中。为每个生成的新表找到一个主键。在新表中复制提取重复组的表的主键,反之亦然。
R1
| Id | Course |
|---|---|
| 1 | C1 |
| 1 | C2 |
| 2 | C3 |
| 3 | C2 |
| 3 | C4 |
R2
| Id | Name |
|---|---|
| 1 | A |
| 2 | E |
| 3 | B |
R1 和 R2 符合第一范式 (1NF)。
R1 的键 = ID
R2 的键 = (rollno, course)
由于不存在多值属性,上表现在符合第一范式 (1NF)。但它不符合第二范式 (2NF),因为 ID->2。名称是部分依赖项 {因为名称依赖于键的一部分}
异常
该表还存在以下异常 −
插入异常 − 除非有学生必须选修该课程,否则我们无法在表中插入新课程,例如"C6"。
更新异常 − 如果我们将课程从 C2 更改为 C5,则必须在多个位置进行更改,否则表格将不一致。

