第一个范式违规

问题描述 投票:0回答:3

假设一个用户可以拥有多个电话号码。

我可以理解,下面的第一个表违反了 1NF,因为

userID=2
是重复的。

+--------+-------+
| userID | phone |
+--------+-------+
| 1      | 1010  |
| 2      | 1020  |
| 2      | 1021  |
| 3      | 1030  |
+--------+-------+

但是第二个表也违反了 1NF 吗?是的,这似乎是一个糟糕的、不灵活的设计 - 但这是否违反了 1NF ?

+--------+--------+--------+
| userID | phone1 | phone2 |
+--------+--------+--------+
| 1      | 1010   |        |
| 2      | 1020   | 1021   |
| 3      | 1030   |        |
+--------+--------+--------+
sql database relational-database database-normalization first-normal-form
3个回答
1
投票

这违反了 1NF。 1NF 要求

  1. 表中没有多值字段。
  2. 表中没有重复组。

phone1
phone2
等是重复组,违反了1NF。

重复 userID=2 并不违反 1NF 本身。


0
投票

当您有第三个电话号码时,您的第二个设计会发生什么?它可能并不违反 1NF,但它的设计很糟糕。例如,我有一个家庭电话号码、一个工作电话号码、一个移动电话号码和一个传真号码。我在工作中使用的 ERP 程序有一个“用户联系人”表,其中包含每个号码的字段。这允许更轻松的输出,但如果一个人拥有多个给定类型的数字,有时可能会导致问题。

处理多个电话号码的标准方法是使用一个单独的表,其中包含字段所有者、电话号码和描述。


0
投票

实际上第一个表并没有违反第一个 NF,因为没有多值属性。它尊重正常形式。第二个表遵循与第一个表相同的逻辑。

您可以在链接中教程的图像解释中查看它,该链接显示了违规以及将违规重构为正常形式。 (https://www.geeksforgeeks.org/first-normal-form-1nf/

© www.soinside.com 2019 - 2024. All rights reserved.