主键应该是什么?

时间:2011-05-23 12:56:41

标签: mysql sql database

我遇到了一个我似乎无法解决的问题。

比如说我有一张即将发布的视频游戏发布的表格:

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会如何?

3 个答案:

答案 0 :(得分:9)

您可以创建一个由game_idplatform组成的复合键,就像创建一个只包含一列的主键一样:

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定义为代理主键,您将来可以为自己提供更多的更改空间。