Таблица слишком большая в базе данных MySQL - PullRequest
0 голосов
/ 22 августа 2010

Я делаю онлайн-игру и одну таблицу в своей базе данных. Возможно, самый важный. Это начинает становиться очень большим. Я создаю функцию, в которой вы можете работать с несколькими пользователями, и для этого у меня есть таблица, которая выглядит примерно так:

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 х user1_gun 30 х user1_inv и 30 х user1_ready.

Эта БД будет интенсивно использоваться, поскольку всем пользователям потребуется вся информация в БД, когда они получат доступ к странице, чтобы перечислить все остальные имена пользователей и тому подобное. Все пользователи также могут изменить как минимум 3 значения в таблице.

Должен ли я ограничить свою таблицу до 9 пользователей или я могу сделать таблицу для 100 пользователей? Я понятия не имею. Я могу немного кодировать, но никогда раньше не управлял большими базами данных и серверами mysql.

РЕДАКТИРОВАТЬ: ОК. Просто быть чистым. У меня есть таблица со всеми видами информации о моих пользователях, таблица для автомобилей, подключенных к таблице пользователей, таблица для оружия, подключенная к моей таблице пользователей. Это не единственная моя таблица, где в игру могут играть не более 9 игроков! В таблице oc должны быть поля с именами пользователей и оружием, которые выбрал каждый пользователь и который указал, что они готовы. Я не думаю, что мне нужна нормализация базы данных ...

Ответы [ 2 ]

7 голосов
/ 22 августа 2010

Вам действительно нужно нормализовать вашу базу данных! Вы используете реляционную базу данных, поэтому первое, что вы должны сделать, это определить отношения в ваших данных.

У вас есть отношения «один ко многим» между игрой и игроком (в одной игре может быть много игроков, но игрок может одновременно играть только в одну игру). Таким образом, вы должны создать игровую таблицу, содержащую информацию, относящуюся конкретно к каждой игре (идентификатор, лидер, автомобиль, тип автомобиля, места, общий ресурс, местоположение). Затем создайте отдельную пользовательскую таблицу, которая содержит все данные, специфичные для пользователя (идентификатор, имя, пистолет, инвентарь, готово). Затем вы можете связать таблицу пользователей с игровой таблицей, используя внешние ключи . Таким образом, в дополнение к уже упомянутой пользовательской информации пользовательская таблица должна включать поле, такое как game_id, в котором идентификатор игры из игрового стола хранится в виде внешнего ключа.

Вероятно, вы можете выполнить дальнейшую нормализацию, включив стол с оружием, автомобильный стол и т. Д.

Нормализация уменьшает избыточные данные, повышает эффективность вашей базы данных и уменьшает аномалии данных. Вот хорошее введение в концепцию: http://dev.mysql.com/tech-resources/articles/intro-to-normalization.html Это также касается объединения таблиц, что вам необходимо сделать при запросе нормализованной базы данных.

EDIT: В ответ на ваше разъяснение вы можете рассмотреть другие решения, помимо базы данных. Вы действительно не должны иметь таблицу в реляционной базе данных, которая выглядит следующим образом. Судя по предоставленной вами информации, кажется, что все, что она делает, - отслеживает игровую информацию, и для этого могут быть лучшие решения, чем реляционная база данных.

Если вы действительно хотите сохранить эту информацию в реляционной базе данных, ее все равно следует нормализовать. Так что, если у вас уже есть отдельная таблица пользователей, вам нужно либо расширить ее, чтобы учесть внутриигровые пользовательские данные, либо, возможно, иметь таблицу active_users с информацией, относящейся к их текущей игре.

1 голос
/ 22 августа 2010

Почему бы не пойти на две колонки БД: в основном, балл ключевого значения. Поскольку это онлайн-игра, это позволит легко использовать memcache для быстрого доступа к данным.

Два столбца будут ключом и значением Значение будет представлять ваши данные в формате json.

...