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