【问题标题】:SQL storing large amount of data for each userSQL为每个用户存储大量数据
【发布时间】:2015-07-23 13:21:51
【问题描述】:

我正在开发一个网站,人们可以在其中玩小游戏。在每场比赛结束时,用户将获得一个分数,我希望将其与时间戳一起存储在 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 还很陌生,所以我可能遗漏了一些愚蠢的东西

【问题讨论】:

  • 查找数据库规范化。 User 表、Games 表,然后是 UserGames 表来存储 id 和时间和分数...
  • 最好的办法是拥有一个具有多对多关系的关系数据库。这样,它将跨多个基于 ID 连接的表,并且在添加更多游戏时不会遇到问题。
  • 感谢您的快速回答,我会立即调查这些
  • @sgeddes 数据库规范化似乎是要走的路。谢谢!

标签: mysql sql user-data


【解决方案1】:

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

您的用户表很好。创建一个游戏表来存储有关游戏的信息。创建一个表格,将有关用户、游戏和结果的信息组合在一起。大概是这样的:

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 上创建索引。那张桌子可以变大,没问题。如果您愿意,可以使用按用户 ID 进行分区,也可以系统地归档数据,因为数据太陈旧而无法定期使用。

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

【讨论】:

【解决方案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 数据库的能力?
  • 嗨 Malt 取决于游戏和用户的数量,您可能必须使用其他数据库,但现在它工作正常。 Mysql相当强大。除此之外,如果您将查找索引设置正确,则无需担心
【解决方案3】:

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

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

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

Results 存储每个玩过的游戏的记录,并具有 UID、GID、Timestamp 和 Score 列。

这样,您可以针对任何用户存储任意数量的游戏得分。

关系数据!

【讨论】:

    【解决方案4】:

    您可能希望在 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
    

    用户游戏地图

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

    可以在这里找到 StackOverflow 的一个很好的例子:Many-to-many relationships examples

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

    【讨论】:

      猜你喜欢
      • 2021-02-01
      • 2016-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-29
      • 2015-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多