主键和规范化

Primary Keys and Normalization

我必须将我的数据库标准化为 BCNF,但我对 1NF 有点困惑。

我的主要 table 是关于视频游戏的,它看起来像这样:

game_id(PK, AI)    title    developer_id(FK)    publisher_id(FK)    genre                   modes                               release_date  
    1              XYZ          3                   5               FPS, Battle Royale      Single-player, multiplayer          2019-02-04

我对 "modes" 和 "genre" 列感到困惑,因为有时我有多个值,所以它不是原子的,对吗?这个评论说的是一样的 但是他下面的评论说的恰恰相反...

我读过关于规范化的内容,我在 1NF 中找到了 this example 的 table。回顾我的 table,我意识到我不能做同样的事情,因为我有一个 'id' 这是一个 PK,所以它不能有重复的值。其他消息来源说,一旦你有了 PK,就意味着 table 在 1NF 中,因为所有行都不同。

我正在考虑创建另外两个 table,我只存储 'modes',它们是(Single-player/Multiplayer/Single-player,多人游戏)和 'genres'。但是,如果游戏只有一个 'id' 也是 PK,我如何将 'mode_id' 作为 FK 插入 'game' table?

那我估计也满足NF2吧?对于 NF3,我应该再创建两个 tables,用于存储游戏模式和游戏类型之间的 n-m 关系...

如果有人想查看我的整个数据库(它又小又简单)并告诉我应该在哪里应用规范化,我会很高兴。谢谢!

您链接的评论是正确的,下面的评论是错误的。

1NF 表示每个属性都需要是原子的(这通常是语义上的意思,而不是技术上的意思。从技术上讲,字符串 "FPS, Battle Royale" 与其他字符串一样是原子的,因为从技术上讲,任何字符串都与其他字符串一样原子.

但 1NF 在语义上的意思是:您不应在单行的单列中存储多个值。

制作 table 1NF 的最简单方法就是将其转换为

game_id(PK, AI)    title    developer_id(FK)    publisher_id(FK)    genre          modes                               release_date  
1                  xyz      3                   5                   FPS            Single-player          2019-02-04
1                  xyz      3                   5                   FPS            multiplayer          2019-02-04
1                  xyz      3                   5                   Battle Royale  Single-player          2019-02-04
1                  xyz      3                   5                   Battle Royale  multiplayer          2019-02-04

当然,这只是1NF。完全归一化,应该是:

table GAMES
game_id(PK, AI)    title    developer_id(FK)    publisher_id(FK)    release_date  
1                  xyz      3                   5                   2019-02-04

table GENRES
genre_id(PK)       name
1                  FPS
2                  Battle Royale

table MODES
mode_id(PK)        name
1                  Single-player
2                  multiplayer

table GAME_GENRE
id      game_id      genre_id
1       1            1
2       1            2

table GAME_MODE
id      game_id      mode_id
1       1            1
2       1            2

``