我一直在研究规范化,我不太确定如何规范化这个数据库?
假设我有这样的东西:
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会是什么样子?
最佳答案
不完全规范化表总是很奇怪的,但是将正常形式看作是不同的阶段。
无论如何:表违反了nf 1,因为数据不是原子的(1, 2
和Joe Johnson, John Johnson
)。通过在列中包含更多记录而不是列表,可以将其转换为NF 1:
|电影ID片名收视率明星ID明星|
| 1布拉赫R 1乔·约翰逊|
| 2 blah2 r 1乔·约翰逊|
| 2 blah2 r 2约翰·约翰逊|
此表的典型主键是movieid+starid。(表名不应该再是movie,因为一行现在不代表一个movie,而是一个movie actor对。)
此表违反nf 2,因为star列不同时依赖于movieid+starid,而只依赖于starid。
这是一个非常奇怪的例子,movieid和starid是人工id。为什么会有人创建一个starid,但把它放在电影桌上?看起来很有结构感。通过移除冗余列,它可以很容易地转换为NF 2:
|电影ID片名收视率明星|
|乔·约翰逊|
| 2 blah2 r乔·约翰逊|
|约翰·约翰逊|
或者保留id并添加星表:
|电影名
| 1布拉赫R 1
| 2叶片2 R 1
| 2叶片2 R 2
|星号|
| 1乔·约翰逊|
| 2约翰·约翰逊|
只是,没人会那样做。你只是不停在NF2。