如何将其归一化为1NF / 2NF?

时间:2016-11-14 16:37:01

标签: mysql sql database oracle

我一直在研究规范化,我不太确定如何规范化这个数据库?

我们只想说我有这样的事情:

Table: Movies

| MovieID | Title | Rating | StarID | Star                      |
| 1       | Blah  | R      | 1      | Joe Johnson               |
| 2       | Blah2 | R      | 1, 2   | Joe Johnson, John Johnson |

1NF会是这样还是我错了?:

Table: Movies

| MovieID | Title | Rating |
| 1       | Blah  | R      |
| 2       | Blah2 | R      |

Table: Movies2
| Movie ID | StarID | Star          |
| 1        | 1      | Joe Johnson   |
| 2        | 2      | John Johnson  |

那时2NF会是什么样子(如果我是对的)?

3 个答案:

答案 0 :(得分:1)

  

如果表在1NF并且没有非素数属性,则表在2NF中   取决于表的任何候选键的任何适当子集。一个   表的非素数属性是不属于的一个属性   表的任何候选键。

电影和电影2是1NF(可能你想将Movies2改为电影明星或主演等)

由于您有Movies2表(MovieID和StarID)的复合主/候选键,您将不得不打扰2nf。 所以你必须将 Star 移动到它自己的表格(StarID和Star)。

但是如果你想要3NF,那么3NF的条件是 -

  

(1)实体处于第二范式,(2)表中的所有属性仅由该表的候选键确定,而不是由任何非素数属性确定。

当您将数据分解为符合以下2NF时,已满足此条件 -
1)电影(MovieID |标题|评级)
2)Movies2(电影ID | StarID)和
3)星星(StarID |星星)

(因为上述数据也满足BCNF标准)。对于您的给定数据,(2NF)完全处理因功能依赖性而导致的所有冗余。

参考文献 - 维基百科(2nf和3nf)

答案 1 :(得分:1)

不完全规范化表格总是很奇怪,但将正常形式视为不同的阶段。

无论如何:该表违反了NF 1,因为数据不是原子的(1, 2Joe Johnson, John Johnson)。您可以通过在列中包含更多记录而不是列表来将其转换为NF 1:

| MovieID | Title | Rating | StarID | Star         |
| 1       | Blah  | R      | 1      | Joe Johnson  |
| 2       | Blah2 | R      | 1      | Joe Johnson  |
| 2       | Blah2 | R      | 2      | John Johnson |

此表的典型主键是MovieID + StarID。 (并且表名不应该是Movie,因为一行现在不代表一部电影,而是一部电影 - 演员对。)

此表违反了NF 2,因为Star列不依赖于MovieID + StarID,而只依赖于StarID。

顺便说一句,这是一个非常奇怪的例子,MovieID和StarID是人工ID。为什么有人会创建一个StarId,但是把它放在Movie表中?看起来非常构造。并且可以通过删除冗余列轻松地将其转换为NF 2:

| MovieID | Title | Rating | Star         |
| 1       | Blah  | R      | Joe Johnson  |
| 2       | Blah2 | R      | Joe Johnson  |
| 2       | Blah2 | R      | John Johnson |

或保留ID并添加星表:

| MovieID | Title | Rating |StarID
| 1       | Blah  | R      |1
| 2       | Blah2 | R      |1
| 2       | Blah2 | R      |2

| StarID | Star         |
| 1      | Joe Johnson  |
| 2      | John Johnson |

只有,没有人会这样做。你根本不会停留在NF 2。

答案 2 :(得分:0)

看来你也需要一张演员表。

Table: Actor
| ActorID | Actor          |
| 1       | Joe Johnson    |
| 2       | John Johnson   |

然后,movies2表变为:

Table: Movies2

| Movie ID | StarID | 
| 1        | 1      | 
| 2        | 2      | 

这将删除movies2中多余的Actor信息,并允许您为多个电影设置多个Stars,或者在不重复Actor名称的情况下使用相同的actor星号,这不是完全依赖MovieID的属性。 StarID指的是Actor表。