这是1NF失败吗?

use*_*ser 6 php mysql sql database normalization

在考虑1NF故障时,没有重复的元素组,如果您想对重复组的数量设置限制,该怎么办?

例如,您希望学生只列出3个电话号码.不再.如果有一个表如下被认为是1NF失败?

Student 1    Phone1    Phone2    Phone3
Sally        111-1111 222-2222   333-3333
John         555-5555 999-9999   NULL
Run Code Online (Sandbox Code Playgroud)

你会创造一个限制.这是否可接受,高效的数据库设计?

将电话号码放在一个单独的表中会不会更好,因为1NF故障要求?如果它位于单独的表中,您将如何为每个用户创建3个数字的限制?

Jak*_*sel 7

不,它没有正常化.当存在空值时,您将在表中浪费空间,如果要执行搜索特定电话号码等操作,则必须搜索所有三列.而是使用一个单独的表(例如,StudentPhoneNumbers)来存储它们.如果要将其限制为三,请使用触发器以防止每个学生超过三个.

  • @ user1122200 - 你似乎太敏感了.我没有在任何地方批评这个问题.如果使用的是1NF的不同定义(Codd vs Date)那么这肯定是相关的.您似乎忽略了它所说的部分,如果您使用Date的定义则违反了该部分. (3认同)
  • 不是2NF或3NF,但**是1NF中的**,这是OP所要求的. (2认同)
  • 这当然似乎是一场高度学术性的辩论.归结到它,答案就是"不要这样做".为什么在第一或第二或第三NF是一个坏主意真的很重要?这仍然是一个坏主意. (2认同)

And*_*mar 6

1NF连续禁止重复列表.您的设计违反了这一点,以下设计也是如此:

Student     Phones
'John D'    '555-5555, 666-6666, 777-7777'
'Sally S'   '111-1111, 222-2222'
Run Code Online (Sandbox Code Playgroud)

以下设计会违反2NF,因为唯一的主键是Name, Phone,但Address属性不依赖于Phone:

Name        Phone       Address
'John D'    '555-5555'  '1 Square Village'
'John D'    '666-6666'  '1 Square Village'
'John D'    '777-7777'  '1 Square Village'
'Sally S'   '111-1111'  '999 Flash City'
'Sally S'   '222-2222'  '999 Flash City'
Run Code Online (Sandbox Code Playgroud)

下一个设计会违反3NF,因为AreaName不依赖于Name,而只依赖于Area:

Name        Area    Phone   AreaName
'John D'    '555'   '5555'  '111name'
'John D'    '666'   '6666'  '666name'
'John D'    '777'   '7777'  '777name'
'Sally S'   '111'   '1111'  '111name'
'Sally S'   '222'   '2222'  '222name'
Run Code Online (Sandbox Code Playgroud)

即使您的设计违反1NF,它也是一个很好的选择.添加PhoneNumber表的复杂性几乎没有道理.

想想如果您遵守1NF,对客户的更新会变得多么困难.这些数字将在一个单独的表格中.因此,如果有人提交了一份包含更新电话号码列表的表单,您将如何更改数据库?首先,您必须检索现有的数字列表.然后你必须将它们与提交的列表进行比较.然后,您必须根据差异删除或插入行.一个复杂的解决方案.

如果坚持使用您的解决方案,您只需更新三列即可.节省的时间可以花在真实的功能上!甚至在Stack Overflow上写下长答案.

  • 这是一个罕见的日子,当我看到有人反对正常化.啊. (2认同)