Mysql 如何将其标准化为1NF/2NF?

Mysql 如何将其标准化为1NF/2NF?,mysql,sql,database,oracle,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 |

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

就说我有这样的东西:

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是什么样子(如果我是对的)

如果一个表在1NF中并且没有非素数属性,那么它在2NF中 依赖于表的任何候选键的任何适当子集。A. 表的非素数属性是不是表的一部分的属性 表的任何候选键

电影和电影2在1NF中(可能是您想将电影2更改为电影明星或主演等)

由于Movies2表(MovieID和StarID)有复合主键/候选键,所以必须考虑2nf。 因此,您必须将星移动到它自己的表中(StarID和Star)

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

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

当您分解数据以满足以下2NF时,此条件已经满足-
1) 电影(电影ID |片名|分级)
2) 电影2(电影ID | StarID)和
3) 星(星号|星)

(因为上述数据也符合BCNF标准)。对于给定的数据,(2NF)完全处理由于函数依赖性而产生的所有冗余

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

如果一个表在1NF中并且没有非素数属性,那么它在2NF中 依赖于表的任何候选键的任何适当子集。A. 表的非素数属性是不是表的一部分的属性 表的任何候选键

电影和电影2在1NF中(可能是您想将电影2更改为电影明星或主演等)

由于Movies2表(MovieID和StarID)有复合主键/候选键,所以必须考虑2nf。 因此,您必须将星移动到它自己的表中(StarID和Star)

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

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

当您分解数据以满足以下2NF时,此条件已经满足-
1) 电影(电影ID |片名|分级)
2) 电影2(电影ID | StarID)和
3) 星(星号|星)

(因为上述数据也符合BCNF标准)。对于给定的数据,(2NF)完全处理由于函数依赖性而产生的所有冗余


参考资料-维基百科(2nf和3nf)

看起来你也需要一个演员表

Table: Actor
| ActorID | Actor          |
| 1       | Joe Johnson    |
| 2       | John Johnson   |
然后,movies2表变为:

Table: Movies2

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

这将删除movies2中多余的演员信息,并允许您在一部电影中有多个明星,或在多部电影中有相同的演员明星,而无需重复演员名称,因为演员名称不是完全依赖于MovieID的属性。StarID指的是Actor表。

似乎您也需要一个Actor表

Table: Actor
| ActorID | Actor          |
| 1       | Joe Johnson    |
| 2       | John Johnson   |
然后,movies2表变为:

Table: Movies2

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

这将删除movies2中多余的演员信息,并允许您在一部电影中有多个明星,或在多部电影中有相同的演员明星,而无需重复演员名称,因为演员名称不是完全依赖于MovieID的属性。StarID指的是Actor表。

不完全规范化表,而是将正规形式视为不同的阶段,这总是很奇怪的

无论如何:该表违反了NF 1,因为数据不是原子的(
1,2
Joe 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 | |电影ID |片名|评级|明星ID |明星| |1 |布拉| R | 1 |乔·约翰逊| |2 | Blah2 | R | 1 |乔·约翰逊| |约翰·约翰逊| 此表的典型主键是MovieID+StarID。(表名不再应该是Movie,因为一行现在不代表一部电影,而是一对电影演员。)

此表违反NF 2,因为Star列不同时依赖于MovieID和StarID,而只依赖于StarID

顺便说一下,这是一个非常奇怪的例子,电影ID和StarID都是人工ID。为什么有人要创建一个StarId,但却把它放在电影表中?看起来很有建设性。通过移除冗余列,可以轻松将其转换为NF 2:

| MovieID | Title | Rating | Star | | 1 | Blah | R | Joe Johnson | | 2 | Blah2 | R | Joe Johnson | | 2 | Blah2 | R | John Johnson | |电影ID |片名|评级|明星| |1 |布拉| R |乔·约翰逊| |2 | Blah2 | R |乔·约翰逊| |约翰·约翰逊| 或者保留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 | |电影ID |片名|评级|明星ID |1 |布拉| R | 1 |2 | Blah2 | R | 1 |2 | Blah2 | R | 2 |StarID | Star| |1 |乔·约翰逊| |2 |约翰·约翰逊|
只是,没有人会这么做。您不必停留在NF2上。

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

无论如何:该表违反了NF 1,因为数据不是原子的(
1,2
Joe 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 | |电影ID |片名|评级|明星ID |明星| |1 |布拉| R | 1 |乔·约翰逊| |2 | Blah2 | R | 1 |乔·约翰逊| |约翰·约翰逊| 此表的典型主键是MovieID+StarID。(表名不再应该是Movie,因为一行现在不代表一部电影,而是一对电影演员。)

此表违反NF 2,因为Star列不同时依赖于MovieID和StarID,而只依赖于StarID

这是一个非常棘手的问题