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个数字的限制?
不,它没有正常化.当存在空值时,您将在表中浪费空间,如果要执行搜索特定电话号码等操作,则必须搜索所有三列.而是使用一个单独的表(例如,StudentPhoneNumbers)来存储它们.如果要将其限制为三,请使用触发器以防止每个学生超过三个.
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上写下长答案.
| 归档时间: |
|
| 查看次数: |
558 次 |
| 最近记录: |