为什么数据库人员继续关于规范化?
它是什么?它有什么用?
它适用于数据库之外的任何内容吗?
规范化基本上是设计数据库模式,以避免重复和冗余数据.如果某些数据在数据库中的多个位置重复,则存在在一个位置而不是另一个位置更新的风险,从而导致数据损坏.
从正常形式到正常形式有许多归一化水平.每种常规形式都描述了如何摆脱一些通常与冗余相关的特定问题.
一些典型的规范化错误:
(1)在单元格中具有多个值.例:
UserId | Car --------------------- 1 | Toyota 2 | Ford,Cadillac
这里"Car"列(它是一个字符串)有几个值.这冒犯了第一个正常形式,即每个单元格应该只有一个值.我们可以通过每辆车单独一行来规范化这个问题:
UserId | Car --------------------- 1 | Toyota 2 | Ford 2 | Cadillac
在一个单元格中具有多个值的问题在于,更新是棘手的,查询很棘手,并且您无法应用索引,约束等.
(2)具有冗余的非密钥数据(即,在多行中不必要地重复数据).例:
UserId | UserName | Car ----------------------- 1 | John | Toyota 2 | Sue | Ford 2 | Sue | Cadillac
此设计是一个问题,因为每个列都重复名称,即使名称始终由UserId确定.这使得理论上可以在一行而不是另一行中更改Sue的名称,这是数据损坏.通过将表拆分为两个并创建主键/外键关系来解决此问题:
UserId(FK) | Car UserId(PK) | UserName --------------------- ----------------- 1 | Toyota 1 | John 2 | Ford 2 | Sue 2 | Cadillac
现在看起来我们仍然有冗余数据,因为UserId是重复的; 但是,PK/FK约束可确保不能单独更新值,因此完整性是安全的.
那很重要么?是的,这非常重要.通过使数据库具有规范化错误,您可以避免将无效或损坏的数据导入数据库.由于数据"永远存在",因此在首次进入数据库时很难摆脱损坏的数据.
不要害怕正常化.标准化水平的官方技术定义非常钝.这听起来像归一化是一个复杂的数学过程.但是,规范化基本上只是常识,你会发现如果你使用常识设计数据库模式,它通常会被完全规范化.
规范化存在许多误解:
有些人认为规范化数据库较慢,而非规范化可以提高性能.但这只适用于非常特殊的情况.通常,规范化数据库也是最快的.
有时归一化被描述为一个渐进的设计过程,你必须决定"何时停止".但实际上,标准化水平只描述了不同的具体问题.通过以上3 NF正常形式解决的问题是摆在首位相当罕见的问题,所以有可能你的模式已经在5NF.
它适用于数据库之外的任何内容吗?不直接,没有.规范化的原则对于关系数据库非常具体.但是,一般的基本主题 - 如果不同的实例可能不同步,您不应该有重复的数据 - 可以广泛应用.这基本上就是DRY原则.
规范化规则(来源:未知)
钥匙(1NF)
整个钥匙(2NF)
除了钥匙(3NF)
...所以帮助我Codd.
最重要的是,它可以消除数据库记录中的重复.例如,如果您有多个地方(表格)可以显示某个人的姓名,您可以将该名称移至单独的表格并在其他地方引用该名称.这样,如果您以后需要更改人名,您只需在一个地方更改它.
它对于正确的数据库设计至关重要,理论上您应该尽可能地使用它来保持数据的完整性.但是,当从许多表中检索信息时,您会丢失一些性能,这就是为什么有时您会看到性能关键应用程序中使用的非规范化数据库表(也称为扁平化).
我的建议是从良好的规范化开始,只在真正需要时进行去标准化
PS还查看了这篇文章:http://en.wikipedia.org/wiki/Database_normalization,以阅读有关该主题和所谓的正常形式的更多信息
规范化用于消除表中列之间的冗余和功能依赖性的过程.
存在几种常规形式,通常由数字表示.数字越大意味着冗余和依赖性越少.任何SQL表都是1NF(第一个普通形式,几乎是定义)规范化意味着以可逆的方式更改模式(通常是对表进行分区),给出一个功能相同的模型,除了冗余和依赖性较少.
数据的冗余和依赖性是不可取的,因为它可能在修改数据时导致不一致.
它旨在减少数据冗余.
有关更正式的讨论,请参阅维基百科http://en.wikipedia.org/wiki/Database_normalization
我会举一个简单的例子.
假设组织的数据库通常包含家庭成员
id, name, address 214 Mr. Chris 123 Main St. 317 Mrs. Chris 123 Main St.
可以归一化为
id name familyID 214 Mr. Chris 27 317 Mrs. Chris 27
和一张家庭餐桌
ID, address 27 123 Main St.
近完全标准化(BCNF)通常不用于生产,但是是一个中间步骤.一旦将数据库放入BCNF,下一步通常是以逻辑方式对其进行反规范化,以加速查询并降低某些常见插入的复杂性.但是,如果没有首先对其进行适当的规范化,就无法做到这一点.
这个想法是将冗余信息简化为单个条目.这在地址这样的领域特别有用,其中Chris先生提交了他的地址,作为Unit-7 123 Main St.和Chris夫人列出Suite-7 123 Main Street,它将在原始表中显示为两个不同的地址.
通常,使用的技术是查找重复的元素,并将这些字段隔离到具有唯一ID的另一个表中,并使用引用新表的主键替换重复的元素.