从 UNF 归一化到 1NF
Normalizing from UNF to 1NF
我目前正在练习数据库规范化,我发现很多来源在获得 1NF 的方法上有所不同。
例如,这是我的 UNF table:
customer
+----+--------+----------------------+
| id | name | phone |
+----+--------+----------------------+
| 1 | achmed | 06-101010, 06-111111 |
+----+--------+----------------------+
| 2 | jozef | 06-232323 |
+----+--------+----------------------+
| 3 | maria | 06-464646, 06-989898 |
+----+--------+----------------------+
一种方法将多值拆分为不同的元组,这会临时创建冗余:
customer
+----+--------+-----------+
| id | name | phone |
+----+--------+-----------+
| 1 | achmed | 06-101010 |
+----+--------+-----------+
| 1 | achmed | 06-111111 |
+----+--------+-----------+
| 2 | jozef | 06-232323 |
+----+--------+-----------+
| 3 | maria | 06-464646 |
+----+--------+-----------+
| 3 | maria | 06-989898 |
+----+--------+-----------+
另一种方法将多值直接拆分为新的关系,可能如下所示:
customer
+----+--------+
| id | name |
+----+--------+
| 1 | achmed |
+----+--------+
| 2 | jozef |
+----+--------+
| 3 | maria |
+----+--------+
customer_phone
+----+-----------+
| id | phone |
+----+-----------+
| 1 | 06-101010 |
+----+-----------+
| 1 | 06-111111 |
+----+-----------+
| 2 | 06-232323 |
+----+-----------+
| 3 | 06-464646 |
+----+-----------+
| 3 | 06-989898 |
+----+-----------+
两者在高范式后最终会相似,但哪种方法应该 'the best practice' 作为 1NF,为什么?
您可以对数据采用三种 1NF 方法。
方法 1:(您的第一个选项)将多值拆分为单独的元组。
方法 2:添加额外的列,即。添加 phone1 和 phone2
方法 3:(您的第二个选项)有 parent/child 关系
方法 3 更好,因为它不仅是 1NF,而且是 2NF 和 3NF。
规范化数据库时,我们通常希望以 3NF 结束。我们可以采用慢速方法并通过 1NF、2NF 然后 3NF,或者我们可以直接进入 3NF。做这个任务 30 年后,我自然而然地生成 3NF 作为第一步。 1NF 和 2NF 仅在修改现有数据库和项目时间限制阻止我们实施 3NF 时发生。
我目前正在练习数据库规范化,我发现很多来源在获得 1NF 的方法上有所不同。
例如,这是我的 UNF table:
customer
+----+--------+----------------------+
| id | name | phone |
+----+--------+----------------------+
| 1 | achmed | 06-101010, 06-111111 |
+----+--------+----------------------+
| 2 | jozef | 06-232323 |
+----+--------+----------------------+
| 3 | maria | 06-464646, 06-989898 |
+----+--------+----------------------+
一种方法将多值拆分为不同的元组,这会临时创建冗余:
customer
+----+--------+-----------+
| id | name | phone |
+----+--------+-----------+
| 1 | achmed | 06-101010 |
+----+--------+-----------+
| 1 | achmed | 06-111111 |
+----+--------+-----------+
| 2 | jozef | 06-232323 |
+----+--------+-----------+
| 3 | maria | 06-464646 |
+----+--------+-----------+
| 3 | maria | 06-989898 |
+----+--------+-----------+
另一种方法将多值直接拆分为新的关系,可能如下所示:
customer
+----+--------+
| id | name |
+----+--------+
| 1 | achmed |
+----+--------+
| 2 | jozef |
+----+--------+
| 3 | maria |
+----+--------+
customer_phone
+----+-----------+
| id | phone |
+----+-----------+
| 1 | 06-101010 |
+----+-----------+
| 1 | 06-111111 |
+----+-----------+
| 2 | 06-232323 |
+----+-----------+
| 3 | 06-464646 |
+----+-----------+
| 3 | 06-989898 |
+----+-----------+
两者在高范式后最终会相似,但哪种方法应该 'the best practice' 作为 1NF,为什么?
您可以对数据采用三种 1NF 方法。
方法 1:(您的第一个选项)将多值拆分为单独的元组。
方法 2:添加额外的列,即。添加 phone1 和 phone2
方法 3:(您的第二个选项)有 parent/child 关系
方法 3 更好,因为它不仅是 1NF,而且是 2NF 和 3NF。
规范化数据库时,我们通常希望以 3NF 结束。我们可以采用慢速方法并通过 1NF、2NF 然后 3NF,或者我们可以直接进入 3NF。做这个任务 30 年后,我自然而然地生成 3NF 作为第一步。 1NF 和 2NF 仅在修改现有数据库和项目时间限制阻止我们实施 3NF 时发生。