数据库中的规范化:请解释它们之间的区别

时间:2015-02-23 07:06:17

标签: mysql database oracle

所以,我是数据库的新手,并且对数据库中的规范化感到困惑。 1NF 2NF 3NF和其他令人困惑的。有人可以为我提供 链接 或解释这些条款以及它们之间的区别。

如果您能提供一种简单的方法来记住这些,那将非常有帮助。

1 个答案:

答案 0 :(得分:0)

规范化可以被视为一系列逐步设计的步骤,以处理表格“为了自己的利益而过于复杂”的方式。规范化的目的是减少数据库中发生异常的可能性

规范化对象:
(1)包含为数据库提供服务所需的所有数据 (2)尽可能少的冗余,
(3)为需要它们的数据类型提供多个值,
(4)允许有效更新数据库中的数据,以及
(5)避免在不知不觉中丢失数据的危险。

在所有级别和每个具有复杂性的表的情况下,问题的解决方案结果是建立两个或更多更简单的表,作为一个组包含与原始表相同的信息,但是因为他们更简单的个人结构,缺乏复杂性。

数据库规范化规则1 消除重复组。为每组相关属性创建一个单独的表,并为每个表提供一个主要表键。

幼犬的非标准化数据项
•小狗号码 •小狗名字
•狗窝代码
•狗窝名称
•狗窝位置
•技巧ID
•技巧名称
•学习中的技巧
•技能水平
在原始数据列表中,每个小狗描述后面都是小狗学习的技巧列表。有些人可能知道10个技巧,有些人可能不知道。要回答“菲菲可以翻身吗?”的问题,我们首先要找到菲菲的小狗记录,然后扫描与记录相关的技巧列表。这是尴尬,低效,非常不整洁 将技巧转移到一个单独的表格中。从小狗信息中分离重复的技巧组导致第一范式。特技表中的小狗编号与小狗表中的主键匹配,提供用于将两个表与连接操作相关联的外键。现在我们可以通过直接检索来回答我们的问题,看看Fifi的小狗号码和“翻转”的技巧ID是否一起出现在特技表中。

第一范式:
小狗桌
小狗号码 - 主键号 小狗名字
犬舍名称
狗窝位置
特技表
小狗号码 技巧ID
技巧名称
学到的诀窍 技能水平

数据库规范化规则2 消除冗余数据 a,如果属性仅依赖于多值键的一部分,请将其删除到一个单独的表。 对于知道它的每只小狗来说,技巧名称(例如“翻身”)似乎是多余的。只是骗取ID。

TRICK TABLE
小狗数字技巧ID技巧名称学习技能等级
52 27“翻身”16 9 53 16“鼻架”9 9 54 27“翻身”9 5
*注意,技巧名称仅取决于多值的一部分(技巧ID),即复合键。 在特技表中,主键由小狗号和技巧ID组成。这对于“学到的”和“技能水平”属性是有意义的,因为它们对于每个小狗 - 技巧组合将是不同的。但技巧名称仅取决于技巧ID。每次关联ID出现在特技表中时,相同的名称将显示为冗余。

第二范式
小狗桌
小狗号码 小狗名字
狗窝代码
犬舍名称
狗窝位置
技巧表
技巧ID
技巧名称
小狗,技巧
小狗号码 技巧ID
学到的诀窍 技能水平
假设你想重新分类一个技巧,即给它一个不同的技巧ID。必须为每一个知道这个伎俩的小狗做出改变。如果你错过了一些变化,你将会有几只小狗在不同的ID下使用相同的技巧,这是一个更新异常。

数据库规范化规则3 消除不依赖于密钥的列。如果属性对密钥的描述没有贡献,请将它们删除到单独的表中 小狗桌
小狗号码 小狗名字
狗窝代码
犬舍名称
小狗表满足第一范式,因为in不包含重复组。它满足第二范式,因为它没有多值键。但关键是小狗号码,狗舍名称和狗窝位置只描述了一个狗窝,而不是小狗。要实现第三范式,必须将它们移动到单独的表中。由于它们描述了一个狗窝,因此狗窝代码成为新“狗窝”表的关键。

第三范式

小狗
小狗号码 小狗名字
狗窝代码
养犬
狗窝代码
犬舍名称
狗窝位置
技巧
技巧ID
技巧名称
小狗技巧
小狗号码 技巧ID
学到的诀窍 技能水平
其动机与第二范式相同。我们希望避免更新和删除异常。例如,假设Puppy Farm中没有小狗当前存储在数据库中。使用之前的设计,将不会有其存在的记录。

复制自: 1)http://www.dbnormalization.com/

有用链接:
1)http://en.wikipedia.org/wiki/Database_Normalization