我遇到了一个我似乎无法解决的问题。
比如说我有一张即将发布的视频游戏发布的表格:
GAME
game_ID | title
-----------------------------
1 | Super Mario
2 | Final Fantasy XIII
然后我有一个包含释放的表(ps3和xbox360的不同日期仅仅是为了参数):
RELEASES
game_ID | releasedate | platform
---------------------------------
1 | 20-04-2010 | Wii
2 | 23-03-2010 | PS3
3 | 20-03-2010 | Xbox360
现在,我已将game_ID作为“GAME”表中的主键。并且game_ID也是“RELEASES”表中的外键。我应该拥有什么作为后者的主键?在“RELEASES”表中创建另一个ID键似乎没有必要吗?
我可以以某种方式一起使用game_ID和平台来创建主键吗?如果是这样,SQL会如何?
答案 0 :(得分:9)
您可以创建一个由game_id
和platform
组成的复合键,就像创建一个只包含一列的主键一样:
PRIMARY KEY(game_id, platform)
答案 1 :(得分:4)
您不希望game_ID成为Releases表中的主键和外键。这将阻止该表为每个游戏提供多个记录,因为主键必须是唯一的。我会推荐这样的结构。
RELEASES
release_ID | game_ID | releasedate | platform
---------------------------------------------
1 | 1 | 20-04-2010 | Wii
2 | 1 | 23-03-2010 | PS3
3 | 1 | 20-03-2010 | Xbox360
release_ID将自动生成。您可以通过在主键中包含平台来使用复合键,但如果单个游戏/平台具有多个版本,则可能会遇到问题。你现在可能认为不可能,但事情会发生变化。
我也认为从不使用具有任何含义作为键的列是一个好习惯,因为事情会发生变化,您无法预测它们将如何变化。如果你的密钥对最终用户毫无意义,那么他们就不会搞乱数据库的结构。
答案 2 :(得分:3)
首先,考虑将Platforms实现为单独的查找表。这不仅减少了数据损坏的可能性,而且还使您的键定义更容易。
主键不必限制在一个字段中。您可以使用多个字段定义复合主键。
但是,在这种情况下,我建议不要使用复合主键,并主张在Releases表上创建新的主键。
为什么呢?好吧,对于初学者,我认为你没有在Releases中捕获到足够的信息。例如,视频游戏通常在不同地区的不同时间发布,因此对于同一游戏和平台有两个版本可能是完全有效的。在这种情况下,您需要一个包含三个字段的复合主键。它在哪里结束? :)
通过将ReleaseID定义为代理主键,您将来可以为自己提供更多的更改空间。