在两个表中都有信息会更好吗?或者创建第三个表?

时间:2010-02-10 02:38:19

标签: php mysql performance

我有一个表GAMES和另一个PLAYERS。目前,每个“游戏”都有一个players_in_game列,但我在PLAYERS表格中没有任何回复。由于这个列是一个数组(以逗号分隔的玩家ID#列表),我认为让每个玩家的记录也包含他们所属游戏的列表可能会更好。另一方面,在两个单独的表中复制信息实际上可能需要更多的DB调用。

从视角来看,游戏中不可能有十几个玩家(通常是4-6是常态),但可能会有大量游戏。

有没有一种好方法可以找出效率更高的方法? 感谢。

5 个答案:

答案 0 :(得分:5)

标准化通常是一件好事。表中的逗号分隔列表表示表格迫切需要外键。如果您担心额外的查询,请查看JOINING

dbo.games
+----+----------+
| id |   name   |
+----+----------+
| 1  |    war   |
| 2  | invaders |
+----+----------+

dbo.players
+----+----------+---------+
| id |   name   | game_id |
+----+----------+---------+
| 1  |   john   |    1    |
| 2  |   mike   |    1    |
+----+----------+---------+

SELECT games.name, count(players.id) as total_players FROM games INNER JOIN players ON games.id = players.game_id GROUP BY games.name;

Result:
+-----------+--------------+
| name      |total_players |
+-----------+--------------+
| war       |       2      |
| invaders  |       0      |
+-----------+--------------+

Sidenote:Go Hokies:)

答案 1 :(得分:2)

天啊,请不要使用CSV!我知道当你是SQL新手时很诱人,但它变得不可思议......

您需要3个表:gamesplayersplayers_in_games。游戏和玩家应该都有id等主要自动递增键,然后players_in_games只需要两个字段player_idgame_id。这被称为“多对多”关系。玩家可以玩很多游戏,游戏可以有很多玩家。

答案 2 :(得分:1)

正确答案是一个名为PlayersInGames的表格,其中每个玩家ID都有一个玩家ID和游戏ID。

答案 3 :(得分:1)

我会创建一个链接玩家和游戏的第三个表。您的逗号分隔列表实际上是第三个表,但解析您的列表几乎肯定会比让数据库为您执行此操作效率低。

答案 4 :(得分:0)

问问自己如果从GAME表中删除一行会发生什么。现在你必须遍历所有PLAYER行,解析列表,找出哪些包含对已删除GAME的引用,然后更新所有列表。

糟糕的设计。让SQL做它诞生的东西。如果正确索引,查询将足够快。像这样的微观优化是错误的方法。

相关问题