我有一个表GAMES
和另一个PLAYERS
。目前,每个“游戏”都有一个players_in_game
列,但我在PLAYERS
表格中没有任何回复。由于这个列是一个数组(以逗号分隔的玩家ID#列表),我认为让每个玩家的记录也包含他们所属游戏的列表可能会更好。另一方面,在两个单独的表中复制信息实际上可能需要更多的DB调用。
从视角来看,游戏中不可能有十几个玩家(通常是4-6是常态),但可能会有大量游戏。
有没有一种好方法可以找出效率更高的方法? 感谢。
答案 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个表:games
,players
和players_in_games
。游戏和玩家应该都有id
等主要自动递增键,然后players_in_games
只需要两个字段player_id
和game_id
。这被称为“多对多”关系。玩家可以玩很多游戏,游戏可以有很多玩家。
答案 2 :(得分:1)
正确答案是一个名为PlayersInGames的表格,其中每个玩家ID都有一个玩家ID和游戏ID。
答案 3 :(得分:1)
我会创建一个链接玩家和游戏的第三个表。您的逗号分隔列表实际上是第三个表,但解析您的列表几乎肯定会比让数据库为您执行此操作效率低。
答案 4 :(得分:0)
问问自己如果从GAME表中删除一行会发生什么。现在你必须遍历所有PLAYER行,解析列表,找出哪些包含对已删除GAME的引用,然后更新所有列表。
糟糕的设计。让SQL做它诞生的东西。如果正确索引,查询将足够快。像这样的微观优化是错误的方法。