首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是标准化(或标准化)?

什么是标准化(或标准化)?
EN

Stack Overflow用户
提问于 2008-10-29 13:01:41
回答 10查看 65.8K关注 0票数 110

为什么数据库的人会继续谈论规范化?

那是什么?它有什么帮助呢?

它是否适用于数据库之外的任何东西?

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2008-10-29 13:15:00

规范化基本上是设计一个数据库模式,以避免重复和冗余数据。如果相同的信息在数据库中的多个位置重复,则存在在一个位置更新而不在另一个位置更新的风险,从而导致数据损坏。

存在从1.范式到5.范式的多个规范化级别。每个范式都描述了如何摆脱一些特定的问题。

第一范式(1NF)是特殊的,因为它与冗余无关。1NF不允许嵌套表,更具体地说是允许表作为值的列。SQL首先不支持嵌套表,所以大多数普通关系数据库默认都在1NF中。因此,我们可以在剩下的讨论中忽略1NF。

范式2NF到5NF都涉及相同信息在同一表中多次表示的场景。

例如,考虑卫星和行星的数据库:

代码语言:javascript
复制
Moon(PK) | Planet  | Planet kind
------------------------------
Phobos   | Mars    | Rock
Daimos   | Mars    | Rock
Io       | Jupiter | Gas
Europa   | Jupiter | Gas
Ganymede | Jupiter | Gas

冗余是显而易见的:木星是一颗气体行星的事实被重复了三次,每个卫星一次。这是对空间的浪费,但更严重的是,这种模式使得不一致的信息成为可能:

代码语言:javascript
复制
Moon(PK) | Planet  | Planet kind
------------------------------
Phobos   | Mars    | Rock
Deimos   | Mars    | Rock
Io       | Jupiter | Gas
Europa   | Jupiter | Rock <-- Oh no!
Ganymede | Jupiter | Gas

查询现在可能会给出不一致的结果,这可能会产生灾难性的后果。

(当然,数据库不能防止输入错误的信息。但它可以防止信息不一致,这也是一个严重的问题。)

规范化的设计将该表拆分为两个表:

代码语言:javascript
复制
Moon(PK) | Planet(FK)     Planet(PK) | Planet kind
---------------------     ------------------------
Phobos   | Mars           Mars       | Rock
Deimos   | Mars           Jupiter    | Gas
Io       | Jupiter 
Europa   | Jupiter 
Ganymede | Jupiter 

现在没有任何事实被重复多次,因此不可能出现不一致的数据。(可能看起来仍然有一些重复,因为行星名称是重复的,但将主键值作为外键重复并不违反规范化,因为它不会带来数据不一致的风险。)

经验法则如果相同的信息可以用更少的单个单元格值表示,而不包括外键,那么应该通过将表拆分为更多的表来规范化该表。例如,第一个表有12个单独的值,而两个表只有9个单独的(非FK)值。这意味着我们消除了3个冗余值。

我们知道相同的信息仍然存在,因为我们可以编写一个join查询,该查询返回与原始非规范化表相同的数据。

如何避免这样的问题?规范化问题很容易通过给概念模型一些思想来避免,例如通过绘制实体-关系图。行星和卫星具有一对多的关系,这意味着它们应该用外键关联表示在两个不同的表中。当在同一个表行中表示具有一对多或多对多关系的多个实体时,就会出现规范化问题。

规范化很重要吗?是的,它非常重要。通过使数据库具有规范化错误,您将面临将无效或损坏的数据放入数据库的风险。由于数据是“永生的”,所以当数据第一次进入数据库时,很难去除损坏的数据。

但我真的不认为区分从2NF到5NF的不同范式是很重要的。当模式包含冗余时,这通常是非常明显的-无论是3NF还是5NF,只要问题得到解决,违反哪个就不那么重要。

(还有一些额外的范式,如DKNF和6NF,它们只与数据仓库等特殊用途的系统相关。)

不要害怕标准化。标准化级别的官方技术定义相当生硬。这听起来像是标准化是一个复杂的数学过程。然而,规范化基本上只是常识,您会发现,如果您使用常识设计数据库模式,它通常会完全规范化。

围绕规范化有许多误解:

  • 有些人认为规范化的数据库速度更慢,而反规范化可以提高性能。然而,这只在非常特殊的情况下是正确的。通常,规范化数据库也是最快的。

  • 有时将标准化描述为一个渐进的设计过程,您必须决定“何时停止”。但实际上,标准化级别只是描述了不同的具体问题。通过第三次NF以上的范式解决的问题首先是相当罕见的问题,所以很可能您的模式已经在5NF中了。

是否适用于数据库之外的任何内容?不直接适用,不适用。规范化的原则对于关系数据库来说是非常特定的。然而,一般的底层主题-如果不同的实例可能不同步,就不应该有重复的数据-可以广泛应用。这基本上就是DRY principle

票数 185
EN

Stack Overflow用户

发布于 2008-10-29 13:07:53

最重要的是,它用于从数据库记录中删除重复项。例如,如果您有多个地方(表)可以出现一个人的名字,那么您可以将这个名字移动到一个单独的表中,并在其他地方引用它。这样,如果您以后需要更改人名,您只需在一个地方更改它。

它对于正确的数据库设计至关重要,理论上您应该尽可能多地使用它来保持数据的完整性。然而,当从许多表中检索信息时,您会损失一些性能,这就是为什么有时您可能会看到在性能关键型应用程序中使用非规范化的数据库表(也称为扁平化)。

我的建议是从良好的正常化程度开始,只有在真正需要的时候才进行反规范化。

另外,也可以查看这篇文章:http://en.wikipedia.org/wiki/Database_normalization来阅读更多关于这个主题和所谓范式的内容

票数 19
EN

Stack Overflow用户

发布于 2008-10-29 13:13:54

规范化用于消除表中列之间的冗余和函数依赖的过程。

有几种范式,通常用数字表示。数字越大,冗余和依赖就越少。任何SQL表都是1NF (第一范式,根据定义)规范化意味着以可逆的方式更改模式(通常对表进行分区),提供功能相同的模型,但冗余和依赖较少。

数据的冗余和依赖性是不希望的,因为它可能导致在修改数据时的不一致。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/246701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档