SQL为每个用户存储大量数据

3
我正在开发一个网站,人们可以在上面玩小游戏。每个游戏结束时,用户将获得一个分数,我希望将其与时间戳一起存储到MySQL数据库中。这样可以让我更好地展示数据。
我使用Facebook登录系统,因此我目前有一个表格,其中包含用户ID、姓名和Facebook ID。目前我的表格如下所示:
ID------Name------UID
 1      Bob     123123
 2      Marley   23134

然后,对于每个用户,我需要像这样的东西:
Game1Time    Game1Score   Game2Time   Game2Score etc....
  3292          400           10           7824
   129           32          101            231

我已经查看了一些其他相关的帖子,人们普遍认为为每个用户创建一个表格是一个不好的想法,但对我来说,那似乎是最简单的方法。

我也可以这样做,将所有数据存储在一个表格中:

ID------Name------UID-------Game1Time-----Game1Score----Game2Time-----Game2Score etc...
 1      Bob     123123      3291, 129      400, 32       10, 101         7824, 231
 2      Marley   23134

但是如果人们玩同一款游戏很多次,这似乎可能会引起问题。
我感觉自己可能缺少一些聪明的方法来解决这个问题,如果您有任何建议,请告诉我。我对SQL还比较新,所以可能会错过一些愚蠢的东西。

1
查找数据库规范化。用户表,游戏表,然后是一个UserGames表来存储id、时间和得分... - sgeddes
1
你最好的选择是使用具有多对多关系的关系型数据库。这样,它将跨多个表基于ID连接,并且当您添加更多游戏时,您不会遇到问题。 - Liam Sorsby
谢谢您的快速回答,我会立即查看这些内容。 - MaltDew
数据库规范化似乎是正确的方法。谢谢! - MaltDew
4个回答

2
有三个表 - 用户、游戏和结果。
用户表存储每个用户的记录,并具有UID和用户名两列。
游戏表存储每个游戏的记录,并具有GID(游戏ID)和游戏名称两列。
结果表存储每个游戏玩过的记录,并具有UID、GID、时间戳和分数四列。
这样,您可以针对任何用户存储尽可能多的游戏分数。
关系型数据!

2

我的建议如下: 基本上,您有两个表格,一个包含uid,您可以使用它来搜索其他所需信息。 此外,根据需要保存内容

ID------Name------UID-------
 1      Bob     123123       
 2      Marley   23134


ID-----UID------GameTime-----GameScore
1      123123    3291           400
2      123123    129             32
3      234134    10             101       
4      432123    7824           231

这看起来可能会奏效。只有一个问题:第二个表会变得如此庞大,以至于需要大量的计算机资源才能搜索整个表吗?还是我低估了MySQL数据库的能力? - MaltDew
嗨,Malt,根据游戏数量和用户数量的不同,你可能需要使用其他数据库,但目前它运行良好。MySQL非常强大。此外,如果你正确设置查找索引,就没有什么可担心的了。 - Blaatz0r

2

我会在这里推荐一些规范化的方法。

您的用户表很好。创建一个游戏表来存储有关游戏的信息。创建一个结合了用户、游戏和结果信息的表。大致如下:

create table users (
  id int primary key,
  name varchar(100),
  uid int
);

create table games (
  id int primary key,
  name varchar(100)
);

create table users_games (
  id int primary key,
  userid int,
  gameid int,
  startdate datetime,
  enddate datetime,
  score bigint,
  constraint fk_users_games_userid foreign key (userid) references users(id),
  constraint fk_users_games_gameid foreign key (gameid) references games(id)
);

使用startdate和enddate,您可以计算用户在游戏上的时间。您可以根据一天中特定小时的不同用户运行统计信息,并且可以基于users_games表的大量报告。您可以根据需要在users_games上创建索引。该表可能会变得很大,但没有问题。如果您愿意,可以按userid进行分区或者随着数据变得太旧而系统地存档数据。示例架构在此处:http://sqlfiddle.com/#!9/315a5

感谢您详细的回答。这解决了我的问题。 - MaltDew
正确的答案,但是...我会避免使用专用字段作为主键,即使它不是一个自增字段(或者在MySQL上的叫法是什么):https://sqlblog.org/2010/02/08/bad-habits-to-kick-putting-an-identity-column-on-every-table - Paolo

1
你需要在UserGameMaps表上使用具有多对多关系的关系型数据库。
用户
ID------Name------UID-------
 1      Bob     123123       
 2      Marley   23134

游戏数据
ID------GameTime-----GameScore
1       3291, 129     400,32
2       10, 101       7824, 231
3       etc etc

UserGameMaps
ID-----UserID------GameId
1      1           1   
2      1           2
3      2           3

这里有一个很好的例子可以在StackOverflow上找到:多对多关系示例
这将使您能够完全分离游戏数据和用户。如果您想添加更多游戏,允许单个游戏有多个得分等,这将有助于解决可能遇到的任何进一步问题。如果您所有的数据都在一个表中,并且想要添加新游戏,则每次想要添加或删除游戏时都必须手动在用户表末尾添加另一列。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接