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
这是一个非常棘手的问题