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

SQL storing large amount of data for each user

我正在开发一个网站,人们可以在其中玩小游戏。在每场比赛结束时,用户将获得一个分数,我希望将其存储在带有时间戳的 MySQL 数据库中。这将使我能够以更好的方式进一步展示数据。

我使用 Facebook 登录系统,所以我目前有一个 table,它由用户 ID、姓名和 Facebook ID 组成。目前我有一个 table 看起来像这样:

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

然后,对于每个用户,我将需要这样的东西:

Game1Time    Game1Score   Game2Time   Game2Score etc....
  3292          400           10           7824
   129           32          101            231

我看过其他一些相关帖子,似乎人们普遍认为为每个用户设置 table 是个坏主意,但对我来说,这似乎是最简单的方法.

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

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

但是当人们玩很多同一个游戏时,这似乎会引起问题。

我觉得我缺少一些聪明的方法,所以如果您有任何建议,请告诉我。我是 SQL 的新手,所以我可能漏掉了一些愚蠢的东西

我的建议如下: 所以基本上你有两个表,其中一个带有 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

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

您的用户 table 很好。创建游戏 table 来存储有关游戏的信息。创建一个 table,结合有关用户和游戏以及结果的信息。类似于:

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)
);

使用开始日期和结束日期,您可以计算用户在游戏中的时间。您可以 运行 统计一天中特定时间的不同用户,以及更多基于 users_games table.

的报告

您可以根据需要在 users_games 上创建索引。那table可以长大,没问题。如果您愿意,可以使用按用户 ID 进行分区,或者系统地归档数据,因为数据太陈旧而无法定期使用。

示例架构在这里:http://sqlfiddle.com/#!9/315a5

您可能希望在 UserGameMaps 上使用具有多对多关系的关系数据库 table

用户

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

用户游戏地图

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

可以在此处的 Whosebug 找到一个很好的例子:Many-to-many relationships examples

这将使您能够将游戏数据和用户完全分开。如果您想添加更多游戏,这将有助于解决您可能遇到的任何进一步问题,允许单个游戏有多个分数。等。如果您将所有数据都放在一个 table 上并且想要添加新游戏,则每次您想要添加或删除游戏时都必须手动将另一列添加到用户 table 的末尾.

有三个表 - 用户、游戏、结果。

用户为每个用户存储一条记录,并具有列 UID 和用户名。

Games 存储每个游戏的记录,并包含列 GID(游戏 ID)和游戏名称。

Results 为每个 玩过的游戏 存储一条记录,并包含列 UID、GID、时间戳和分数。

这样一来,您可以根据需要存储任意多场比赛的分数,针对任何用户。

关系数据!