【问题标题】:Table too big in MySQL databaseMySQL数据库中的表太大
【发布时间】:2023-03-20 23:18:01
【问题描述】:

我正在制作一个在线游戏,并在我的数据库中创建一个表格。可能是最重要的一个。它开始变得非常大。我正在创建一个函数,您可以在其中与多个用户一起使用,为此我有一个到目前为止看起来像这样的表:

CREATE TABLE `oc` (
  `id` int(11) NOT NULL auto_increment,
  `leader` varchar(40) NOT NULL default '',

  `car` int(11) NOT NULL default '0',
  `car_type` char(2) NOT NULL default '',  

  `seats` varchar(3) NOT NULL default '0',
  `share` enum('1','2') NOT NULL default '1',
  `location` varchar(100) NOT NULL default '',  

  `user1` varchar(40) NOT NULL default '', 
  `user2` varchar(40) NOT NULL default '',  
  `user3` varchar(40) NOT NULL default '', 
  `user4` varchar(40) NOT NULL default '', 
  `user5` varchar(40) NOT NULL default '',  
  `user6` varchar(40) NOT NULL default '', 
  `user7` varchar(40) NOT NULL default '', 
  `user8` varchar(40) NOT NULL default '', 
  `user9` varchar(40) NOT NULL default '', 

  `leader_gun` char(2) NOT NULL default '', 
  `user1_gun` char(2) NOT NULL default '', 
  `user2_gun` char(2) NOT NULL default '',  
  `user3_gun` char(2) NOT NULL default '', 
  `user4_gun` char(2) NOT NULL default '', 
  `user5_gun` char(2) NOT NULL default '',  
  `user6_gun` char(2) NOT NULL default '',  
  `user7_gun` char(2) NOT NULL default '', 
  `user8_gun` char(2) NOT NULL default '', 
  `user9_gun` char(2) NOT NULL default '',   

  `user1_inv` varchar(40) NOT NULL default '', 
  `user2_inv` varchar(40) NOT NULL default '',  
  `user3_inv` varchar(40) NOT NULL default '', 
  `user4_inv` varchar(40) NOT NULL default '', 
  `user5_inv` varchar(40) NOT NULL default '',  
  `user6_inv` varchar(40) NOT NULL default '',  
  `user7_inv` varchar(40) NOT NULL default '', 
  `user8_inv` varchar(40) NOT NULL default '', 
  `user9_inv` varchar(40) NOT NULL default '',    

  `user1_ready` enum('0','1') NOT NULL default '1', 
  `user2_ready` enum('0','1') NOT NULL default '1',  
  `user3_ready` enum('0','1') NOT NULL default '1', 
  `user4_ready` enum('0','1') NOT NULL default '1',  
  `user5_ready` enum('0','1') NOT NULL default '1', 
  `user6_ready` enum('0','1') NOT NULL default '1',  
  `user7_ready` enum('0','1') NOT NULL default '1', 
  `user8_ready` enum('0','1') NOT NULL default '1',   
  `user9_ready` enum('0','1') NOT NULL default '1',     

  PRIMARY KEY  (`id`)
) TYPE=MyISAM ;

现在我想知道我的局限性是什么。最多可以有 30 个用户一起玩会很酷,但是我的桌子需要 3 倍的字段。 30 x user1_gun 30 x user1_inv 和 30 x user1_ready

这个数据库将被大量使用,因为所有用户在访问页面时都需要数据库中的所有信息以列出所有其他用户名等。所有用户还可以更改表中至少 3 个值。

我应该将我的表限制为 9 个用户还是我可以为 100 个用户创建一个表?我不知道。我可以进行一些编码,但以前从未管理过大型 mysql 数据库和服务器。

编辑:好的。只是要清楚。我有一个包含有关我的用户的各种信息的用户表,一个连接到用户表的汽车表,一个连接到我的用户表的武器表。 这不是我唯一一个最多可以有 9 名玩家玩游戏的表! oc 表需要包含每个用户选择的用户名和枪支字段,以及表示他们准备好的用户。 . 我认为我不需要数据库规范化...

【问题讨论】:

  • 您来得正是时候:您正在寻找一些重度标准化。 :)(现在不能写帖子,但我相信有人会。)
  • 而不是将所有用户的数据存储在同一个表中。创建一个新表并链接到该表,以便您可以在游戏中存储无限数量的用户。在 wikipedia 或 stackoverflow 上阅读有关数据库规范化的更多信息:en.wikipedia.org/wiki/Database_normalization
  • 这款游戏的实时性如何? MySQL 在这里可能不是您的最佳选择。

标签: php mysql load scalability


【解决方案1】:

你真的需要normalize你的数据库!您正在使用关系数据库,因此您应该做的第一件事是定义数据中的关系。

游戏和玩家之间存在一对多的关系(一个游戏可以有很多玩家,但一个玩家一次只能玩一个游戏)。因此,您应该创建一个游戏表,其中包含与每个游戏相关的信息(id、leader、car、car_type、seats、share、location)。然后创建一个单独的用户表,其中包含特定于用户的所有数据(id、name、gun、inventory、ready)。然后,您可以使用foreign keys 将用户表链接到游戏表。所以,除了前面提到的用户信息外,用户表还应该包含一个game_id这样的字段,该字段将游戏表中的游戏id作为外键存储。

您可能可以通过包括枪表、汽车表等来进一步规范化。

规范化可减少冗余数据,提高数据库效率并减少数据异常。下面是对这个概念的一个很好的介绍:http://dev.mysql.com/tech-resources/articles/intro-to-normalization.html 这也涉及连接表,查询规范化数据库时需要这样做。

编辑: 作为对您的澄清的回应,您可能需要研究数据库以外的解决方案。您真的不应该在关系数据库中拥有像这样的表。根据您提供的信息,这一切似乎都是为了跟踪游戏中的信息,并且可能有比关系数据库更好的解决方案。

如果您真的想将此信息保存在关系数据库中,则仍应对其进行规范化。因此,如果您已经有一个单独的 user 表,您需要扩展它以考虑游戏内用户信息,或者可能有一个 active_users 表,其中包含特定于他们当前游戏的信息。

【讨论】:

    【解决方案2】:

    为什么不选择两列数据库:基本上是一个键值分数。由于它是一款在线游戏,因此可以轻松使用 memcache 快速访问数据。

    这两列是键和值 值将是您的数据的 json 表示。

    【讨论】:

    • 不太明白如何将当前数据库中的值分隔为两列数据库
    猜你喜欢
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多