mysql - 如何将其归一化为 1NF/2NF?

标签 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 |

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、2Joe 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/

相关文章:

java - 为什么结果集为空

mysql密码错误并关闭

MySQL 计数/跟踪连续日期或连续日期 - 跟进

php - 如何在 codeigniter 中为 group_concat 和 concat 编写查询并替换表列

mysql - SQL语法帮助,条件AND

sql - 将表从外部数据库复制到内部数据库

java - 使用mybatis注释在IN子句中传递多个值

MySQL:如何防止删除?

php - 如何在CSV文件中保留反斜杠或将其更改为NULL以在PHP中生成SQL文件

sql - 如何在查询记录处理器中转换 DateTime