Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 主键应该是什么?_Mysql_Sql_Database - Fatal编程技术网

Mysql 主键应该是什么?

Mysql 主键应该是什么?,mysql,sql,database,Mysql,Sql,Database,我遇到了一个我似乎无法解决的问题 比如说,我有一张关于即将发布的视频游戏的桌子: GAME game_ID | title ----------------------------- 1 | Super Mario 2 | Final Fantasy XIII 然后我有一个带有发布日期的表(ps3和xbox360的不同日期只是为了讨论): 现在,我把game_ID作为表“game”中的主键。而game_ID也是表“RELEASES”中的外键。在

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

比如说,我有一张关于即将发布的视频游戏的桌子:

GAME
game_ID | title             
-----------------------------
1       | Super Mario
2       | Final Fantasy XIII
然后我有一个带有发布日期的表(ps3和xbox360的不同日期只是为了讨论):

现在,我把game_ID作为表“game”中的主键。而game_ID也是表“RELEASES”中的外键。在后者中,我应该使用什么作为主键?似乎没有必要在“RELEASES”-表中创建另一个ID键


我可以用游戏ID和平台一起创建主键吗?如果是这样,SQL会是什么样子?

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

PRIMARY KEY(game_id, platform)

您不希望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
版本号将自动生成。您可以通过在主键中包含平台来使用复合键,但如果单个游戏/平台有多个版本,则可能会遇到问题。你可能认为现在不可能了,但事情变了


我也认为最好不要使用任何有意义的专栏,因为事情发生了变化,你无法预测它们会如何改变。如果密钥对最终用户毫无意义,那么它们就不会影响数据库的结构。

首先,将实现平台看作一个单独的查找表。这不仅减少了数据损坏的机会,而且还使密钥定义更容易

主键不必限制在一个字段内。可以使用多个字段定义复合主键

但是,在本例中,我建议不要使用复合主键,并建议在Releases表上创建一个新的主键

为什么??好吧,首先,我认为你在发行版中没有捕捉到足够的信息。例如,视频游戏通常在不同地区的不同时间发布,因此为同一游戏和平台发布两个版本是完全有效的。在这种情况下,您需要一个由三个字段组成的复合主键。它在哪里结束?:)


通过将ReleaseID定义为代理主键,您可以在将来为自己提供更多的更改空间

就这么简单,嗯?=)使用复合密钥有什么缺点吗?没有技术上的缺点。史蒂夫·马洛里(Steve Mallory)和保罗·艾伦·泰勒(Paul Alan Taylor)的回答中提到了我能想到的唯一的缺点,但在我看来,这要根据具体情况来决定……它有一个带有游戏id和平台的复合键,因此每个游戏都可以在多个平台上进行多次发布。但是,我投了赞成票,因为我同意将release_id添加为PK@Tudor我对主键(game_id,platform)的问题是在同一个平台上发布多个版本,尽管现在可能不是问题,这种情况可以通过向组合键添加release date来解决,但这并不好either@Tudor除非同一个游戏、同一个平台、同一天有两个版本:)但我们可以补充……也不包括不同地区的版本。
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