我一直在研究规范化,我不太确定如何规范化这个数据库?
我们只想说我有这样的事情:
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会是什么样子(如果我是对的)?
答案 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, 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 |
此表的典型主键是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表。