我一直在研究规范化,但不太确定如何规范化此数据库?
假设我有这样的东西:
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:
| 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,因为现在一行代表的不是一部电影,而是一对电影 Actor 。)
此表违反了 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 并添加一个 Star 表:
| 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。
关于mysql - 如何将其归一化为 1NF/2NF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40593616/