我必须将我的数据库标准化到BCNF,但是我对1nf有点困惑。
我的主桌是关于视频游戏的,它看起来是这样的:
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中的表的例子。 回头看看我的表,我意识到我不能做同样的事情,因为我有一个“ID”,它是一个PK,所以它不能有重复的值。 其他消息来源说,一旦你有一个PK,这意味着表是在1NF,因为所有的行都是不同的。
我正在考虑创建另外两个表,其中我只存储‘模式’(单人/多人/单人,多人)和‘流派’。 但是,如果一个游戏只有一个“ID”,也是一个PK,我该如何在“游戏”表中插入“mode_id”作为FK呢?
那我猜它也满足NF2? 对于NF3,我应该再创建两个表来存储游戏模式和游戏流派之间的n-m关系。
如果有人想看看我的整个数据库(它很小很简单),告诉我应该在哪里应用规范化,我会很高兴的。 谢谢!
你可以张贴整个数据库,请得到一个完整的图片?
你链接的评论是正确的,下面的评论是错误的。
1NF说每个属性都需要是原子的(这通常是语义上的意思,而不是技术上的意思。从技术上讲,字符串“FPS,Battle Royale”和任何其他字符串一样是原子的,因为从技术上讲,任何字符串都和任何其他字符串一样是原子的。
但是1NF在语义上的意思是:您不应该在单行的单列中存储多个值。
使表为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
``