主键和规范化
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
``
我必须将我的数据库标准化为 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
``