База данных SQL: использовать одну таблицу с 3,5 млн записей или много таблиц с меньшим количеством записей? - PullRequest
3 голосов
/ 17 мая 2011

Я создаю футбольную игру, которая позволяет людям создавать лиги онлайн.

Скажем, у меня 1000 лиг через некоторое время. Я храню свои данные в SQL. Должен ли я:

1) Создайте 1 отдельную базу данных с таблицей «реестры» и вставьте в нее всех игроков всех лиг (что будет приблизительно от 3,5 до 4 миллионов записей на 1000 лиг)

2) Создайте 1 отдельную базу данных с 20 таблицами «реестры1, реестры2 и т. Д.» И разделите списки лиг между этими 20 таблицами

3) Создайте 1 базу данных для каждой лиги с таблицей «реестры» в каждой

4) Создайте 20 баз данных с одной таблицей «реестров» в каждой и разделите списки лиг между 20 базами данных.

Каков наилучший вариант для производительности и быстрых запросов SQL?

Ответы [ 2 ]

1 голос
/ 17 мая 2011

Звучит так, что сначала вам нужно изучить несколько основ базы данных, поэтому, пожалуйста, потратьте некоторое время, чтобы убедиться, что вы понимаете Нормализация базы данных и индексы .

ОднакоВ принципе, вам, вероятно, понадобится таблица «Players» (идентификатор игрока, имя и т. д.), таблица «roster» (идентификатор реестра, имя, возможно, owner_id) и player_roster_map (player_id, roster_id), который связывает их.Возможно, вам понадобится уникальное ограничение для составного значения player_id и roster_id, и у вас должно быть ограничение внешнего ключа для player_id и roster_id в этой таблице сопоставления.

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

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

Правильные индексы помогут вам при выполнении запросов, как правило, с небольшими затратами с точки зрения производительности вставки.Если в результате вы получаете большое количество идентичных значений или большое количество запросов, в которых используется только небольшой диапазон значений (например, временные диапазоны), вам, возможно, в конечном итоге также понадобится разобраться в разделении.Секционирование позволяет вам получить преимущества от работы с довольно большим количеством записей без проблем моделирования, которые могут возникнуть при денормализации.Однако не делайте этого преждевременно;вы, вероятно, обнаружите, что правильного дизайна базы данных будет достаточно с размером набора данных, который вы подразумеваете.

1 голос
/ 17 мая 2011

Я думаю, что вы хотите вариант 1 в принципе. Вы должны рассмотреть варианты использования, такие как перемещение кого-либо из одного реестра в другой: вы не хотите, чтобы это происходило в разных базах данных. И я представляю много запросов, которые вы хотите запустить против всех списков. Может оказаться полезным исследовать разбиение , хотя MySQL не предлагает его. (Postgresql делает.)

Вам также нужно взглянуть на нормализацию. Пример: я предполагаю, что у вас есть таблица teams, а PlayerTeam - это просто внешний ключ (вы должны индексировать этот столбец в обеих таблицах) Если это не имеет смысла, потратьте немного времени на книгу по дизайну базы данных или веб-сайт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...