我想知道,因为我是新手使用MySQL,如果实际上有一种方法可以在一个表上有一个以上的选项,同时选择多个选项。 假设我正在创建一个视频游戏桌,并且某些标题可以在多个平台上使用(PC,PS3,XBox等),有没有办法让桌面上有一个名为platform的列,并有可能选择更多比其中一个选项? 编辑:我已经尝试使用ENUM但除非我忽略了一些我不能选择使用它的多个选项。 谢谢
答案 0 :(得分:2)
TABLE Game (GameID, GameName, ...)
TABLE Platform (PlatformID, PlatformName, ...)
TABLE GamePlatform (GameID, PlatformID)
如果游戏#1在平台#2,#3和#7上可用,您将在表GamePlatform
中记录三条记录:
INSERT INTO GamePlatform(GameID, PlatformID) VALUES (1, 2), (1, 3), (1, 7)
答案 1 :(得分:1)
您可以使用SET
指定可以合并的值列表。
但是,这通常被认为是糟糕的表设计,因为很难连接使用多值列的表。对多对多关系使用关系表通常更好。研究数据库规范化以了解更多相关信息。
答案 2 :(得分:1)
有一个解决方法。这里的缺点是你必须为此添加一个新表。
第一步:为所有控制台类型创建一个表console
。
id | name
---------
1 | PS3
2 | Xbox
3 | Wii
以及可以对其进行分组的表格。假设游戏id1是Mario Kart。你可以在PS3和Xbox上播放它。然后你有下一个。
id | gameId | consoleId
------------------------
1 | 1 | 2
2 | 1 | 1
其中gameId
是game
表的FK,而consoleId
是console
表的FK。
第一列id
是可选的(不是必需的)。
答案 3 :(得分:0)
您甚至可以创建varchar类型字段并存储由commans(1,2,5,8)分隔的数字,并将其映射到实际的平台名称。然后你可以使用mysql的FIND_IN_SET来匹配特定的数字,比如Comma separated value search in mysql
当你的桌子变得很大和/或想要一个合适的桌面设计时,如果你关心性能,那么不使用它。
答案 4 :(得分:0)
可以在列中添加多个选项,但这样做有一个缺点,因为您需要找到值的长度并使用INSTR()和/或SUBSTR()来查找位置(这是单调乏味,一路上可能存在问题)
更好的解决方案是使用联结表,多对多(m:n),方法是将Game_ID和Platform_ID设置为自己表中的主键。