假设一个用户可以拥有多个电话号码。
我可以理解,下面的第一个表违反了 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 | |
+--------+--------+--------+
这违反了 1NF。 1NF 要求
phone1
、phone2
等是重复组,违反了1NF。
重复 userID=2 并不违反 1NF 本身。
当您有第三个电话号码时,您的第二个设计会发生什么?它可能并不违反 1NF,但它的设计很糟糕。例如,我有一个家庭电话号码、一个工作电话号码、一个移动电话号码和一个传真号码。我在工作中使用的 ERP 程序有一个“用户联系人”表,其中包含每个号码的字段。这允许更轻松的输出,但如果一个人拥有多个给定类型的数字,有时可能会导致问题。
处理多个电话号码的标准方法是使用一个单独的表,其中包含字段所有者、电话号码和描述。
实际上第一个表并没有违反第一个 NF,因为没有多值属性。它尊重正常形式。第二个表遵循与第一个表相同的逻辑。
您可以在链接中教程的图像解释中查看它,该链接显示了违规以及将违规重构为正常形式。 (https://www.geeksforgeeks.org/first-normal-form-1nf/)