从 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 时发生。