Что более эффективно: несколько таблиц MySQL или одна большая таблица?


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

  • это будет помощь или помеха?
  • соображения скорости при вызове, обновлении или поиск / манипулирование?

вот пример некоторых из моих структур таблиц:

  • пользователи-идентификатор пользователя, имя пользователя, электронная почта, зашифрованный пароль, дата регистрации, ip
  • user_details-данные cookie, имя, адрес, контактные данные, принадлежность, демографические данные
  • user_activity-вклады, последний онлайн, последний просмотр
  • user_settings - параметры отображения профиля
  • user_interests - рекламного таргетинга переменные
  • user_levels - права доступа
  • user_stats - хиты, состыкуется

Edit: я до сих пор поддерживал все ответы, все они имеют элементы, которые по существу отвечают на мой вопрос.

большинство таблиц имеют соотношение 1:1, которое было основной причиной их денормализации.

будут ли проблемы, если таблица охватывает более 100 столбцов, когда большая часть этих ячеек, вероятно, будет оставаться пустым?

8 81

8 ответов:

несколько таблиц помогают в следующих случаях:

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

(b) Если вы хотите предоставить разные полномочия разным людям для разных частей сбора данных, может быть более удобно разделить их. (Конечно, вы можете посмотреть на определение представлений и дать разрешение на них соответствующим образом).

(c) для перемещение данных в разные места, особенно во время разработки, может иметь смысл использовать таблицы, приводящие к меньшим размерам файлов.

(d) меньший отпечаток стопы может обеспечить комфорт при разработке приложений для конкретного сбора данных одного объекта.

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

мой голос будет за несколько таблиц-с соответствующим разделением данных.

удачи.

объединение таблиц называется денормализацией.

Он может (или не может) помочь сделать некоторые запросы (которые делают много JOIN s) работать быстрее за счет создания адского обслуживания.

MySQL способен использовать только JOIN способ, а именно NESTED LOOPS.

Это означает, что для каждой записи в таблице MySQL находит соответствующую запись в управляемой таблице в цикле.

поиск записи является довольно дорогостоящей операцией что может занять в десятки раз больше времени, чем сканирование чистой записи.

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

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

ад обслуживания, с другой стороны, гарантирован.

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

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

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

Do все из этих таблиц есть 1-to-1 отношения? Например, каждая строка пользователя будет иметь только одну соответствующую строку в user_stats или user_levels? Если это так, то имеет смысл объединить их в одну таблицу. Если отношения не1 to 1 хотя, вероятно, не имеет смысла объединять (денормализовать) их.

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

ETA:

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

если вы посмотрите на то, как вы используете данные, я думаю, что вы обнаружите, что примерно 80% ваших запросов используют 20% этих данных, а остальные 80% данных используются только иногда. Объедините часто используемые 20% в одну таблицу и оставьте 80%, которые вы не часто используете в отдельных таблицах, и у вас, вероятно, будет хороший компромисс.

Почему бы не использовать тот же подход, что и Wordpress, имея таблицу пользователей с основной информацией о пользователе, которую имеет каждый, а затем добавить таблицу "user_meta", которая в основном может быть любой парой ключей, значений, связанных с идентификатором пользователя. Поэтому, если вам нужно найти всю метаинформацию для пользователя, вы можете просто добавить ее в свой запрос. Вам также не всегда придется добавлять дополнительный запрос, если он не нужен для таких вещей, как вход в систему. Преимущество этого подхода также оставляет открытым для добавления новых функции для ваших пользователей, такие как хранение их дескриптора twitter или каждого отдельного интереса. Вам также не придется иметь дело с лабиринтом связанных идентификаторов, потому что у вас есть одна таблица, которая управляет всеми метаданными, и вы ограничите ее только одной ассоциацией вместо 50.

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

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

Edit: Я обновил мой ответ, как вы обновили свой вопрос... Я согласен с моим первоначальным ответом еще больше с тех пор...

большая часть этих клеток скорее всего, останется пустым

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

Я работал в телефонной компании, где было много таблиц, получение данных может потребовать много соединений. Когда производительность чтения из этих таблиц была критической, тогда создавались процедуры, которые могли генерировать плоскую таблицу (т. е. денормализованную таблицу), которая не требовала бы никаких соединений, вычислений и т. д., на которые могли бы указывать отчеты. Они затем используются в сочетании с агентом SQL server для запуска задания через определенные промежутки времени (т. е. еженедельное представление некоторых статистических данных будет работать раз в неделю и так далее).

Я думаю, что это одна из тех "Это зависит" ситуации. Наличие нескольких таблиц чище и, вероятно, теоретически лучше. Но когда вам нужно объединить 6-7 таблиц, чтобы получить информацию об одном пользователе, вы можете начать переосмысливать этот подход.

Я бы сказал, что это зависит от того, что на самом деле означают другие таблицы. Содержит ли user_details более 1 больше / пользователей и так далее. Какой уровень нормализации лучше всего подходит для ваших нужд, зависит от ваших требований.

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

Мне кажется, что вы можете пропустить User_Details, поскольку это, вероятно, 1 к 1 отношение с пользователями. Но остальные вероятно, много строк на пользователя?