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