如何轻松理解规范化 - 数据库

时间:2016-02-01 12:13:03

标签: sql database

我经历了很多网站以了解规范化,但似乎我必须记住这些规则。一周或更长时间后,我忘了它,似乎每件事对我来说都是新的。

有没有更好的方法来理解前三种常规形式。我需要一些简单实用的例子来理解和记住它。

现在我知道,

1st Normal Form - Remove Repeating groups (should be Atomic).
2nd Normal Form - Remove partial Dependency.
3rd Normal Form - Remove transitive Dependency.

3 个答案:

答案 0 :(得分:0)

有一个很好的解释on Dream in Code

例如,尝试记住最常见的违规行为:

  1. 单个字段中的名字和姓氏
  2. 存储商品的名称和价格以及该商品的订单
  3. 使用客户记录存储地址

答案 1 :(得分:0)

第一个正式表格应该清楚。 您拥有原子值并在表中创建冗余。此时它意味着:您当前的主键不再是唯一的。

2NF意味着您应该消除冗余数据。 属性需要依赖于您的主键,而不是其他非素数属性。如果它们不依赖于您的主键,则您的表不在第二个NF中。

3NF有点困难。我刚刚读到了关于它的另一个定义。所以通常你有:你的属性不能传递给你的主键。 转换意味着您的属性不应通过其他属性引用您的主键。让我们看一个示例:

| CourseNr    | Course Name         | ProfNr| ProfName  |
---------------------------------------------------------
10            | Analysis            | 90    | A         |
12            | Math                | 90    | A         |
16            | Databases           | 65    | D         |
17            | Literature          | 68    | F         |
---------------------------------------------------------

但是现在你有一个从ProfName到CourseName的传递依赖,因为你的ProfName依赖于ProfNr到CourseNr。您的教授的名字不是您的桌子所必需的,而且您有冗余。现在您可以将其提取到:

| ProfNr | ProfName |
---------------------
| 90     | A        |
| 65     | D        |
| 68     | F        |
---------------------

现在您可以删除第一个表格中的ProfName行。您的冗余已经消除,您可以通过ProfNr链接您的教授。

你的第一张桌子现在看起来像这样:

| CourseNr    | Course Name         | ProfNr |
----------------------------------------------
10            | Analysis            | 90     |
12            | Math                | 90     |
16            | Databases           | 65     |
17            | Literature          | 68     |
----------------------------------------------

对我来说:对于第三个NF,我总是有一个简单的例子,因为对我来说,我遇到了NF问题。

答案 2 :(得分:0)

以第一次规范化的形式应该没有冗余,即值应该是原子的 例如: 1 Rahul Computer Networks, Designing

在这里,“计算机网络”的“设计”不应出现在同一列中,因为它不会产生原子性。其值应类似于

     1. 1   Rahul   Computer Networks
     2. 1   Rahul   Designing`

避免冗余

第二次归一化形式不应存在部分依赖关系,并且应为1NF。 部分依赖:候选键的少量属性确定了非素数 属性。 换句话说,

     A → B is called a partial dependency if and only if-
     1. A is a subset of some candidate key
     2. B is a non-prime attribute.

     If any one condition fails, then it will not be a partial dependency.

第三次规范化形式:不应有任何传递依赖,并且应为2NF。 传递依赖项:只有在以下情况下,A→B称为传递依赖项: 1. A不是超级键。 2. B是非素数属性。 如果任何一个条件失败,那么它不是传递依赖。

如果每个非平凡函数依赖项X –> Y中至少满足以下条件之一,则关系为3NF

    X is a super key.
    Y is a prime attribute (each element of Y is part of some candidate key)

BCNF :如果存在每个非平凡的功能依赖关系,则该关系位于BCNF中

    X –> Y, X is a super key.