2014-02-10 10 views
2

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

user_id int unsigned NOT NULL, 
project_id int unsigned NOT NULL, 
folder_id int unsigned NOT NULL, 
file_id int unsigned NOT NULL, 
data TEXT NOT NULL 

Единственный способ, чтобы создать уникальный первичный ключ для этой таблицы будет композит (user_id, project_id, folder_id, file_id). Я часто видел 2 столбца составных первичных ключей, но это нормально, чтобы иметь 4 или даже больше? Согласно MySQL: «Все хранилища поддерживают не менее 16 индексов на таблицу и общую длину индекса не менее 256 байтов. Большинство движков хранения имеют более высокие пределы», поэтому я знаю, по крайней мере, это можно сделать.

Прошлое, есть частые запросы к этой таблице для различных комбинаций этих идентификаторов. Например, найдите все проекты для пользователя X, найдите все файлы для пользователя X, найдите все файлы для проекта Y и папку Z и т. Д. Если на каждом из столбцов идентификатора есть отдельный индивидуальный ключ или если есть составной первичный ключ, который уже содержит все столбцы, делает лишние отдельные ключи избыточными? В любой момент в таблице будет около 10 миллионов - 50 миллионов строк.

Подводя итог: хорошо ли иметь составной первичный ключ с 4 (или более) столбцами id, а если есть составной ключ, он делает лишние отдельные ключи для каждого из этих столбцов избыточными?

+0

Насколько я знаю, нет ничего, что сделало бы первичный ключ n-column плохой идеей, если это помогает поддерживать нормализацию данных. Кроме того, я бы создал отдельные индексы для полей, на которых будут самые условия 'where'. – Barranka

ответ

2

Да, это нормально, если у вас есть составной первичный ключ с 4 или более столбцами.

Это не обязательно делает дополнительные ключи для каждого из этих столбцов избыточными. Например, key (a, b, c) не будет полезен для запроса SELECT ... WHERE b = 4. Для этого типа запроса вы бы предпочли бы key (b) или key (b, c).

Вам необходимо изучить ваши ожидаемые запросы, чтобы определить, какие индексы вам понадобятся. Поделитесь этим сообщением, чтобы узнать подробности: http://youtu.be/AVNjqgf7zNw

1

Да, это нормально, если модель данных поддерживает его. Вы не много рассказали о своей общей схеме БД и о том, как эти элементы связаны друг с другом, чтобы определить, можно ли считать это наилучшим подходом. Другими словами, это действительно единственный способ, с помощью которого эти элементы связаны друг с другом или, например, файлы ДЕЙСТВИТЕЛЬНО относятся к проектам и проектам, связанным с пользователями, или что-то вроде этого, так что разделение этих таблиц объединений делает более логичным смысл ,

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

+0

Скорее всего, потребуются дополнительные составные индексы с столбцами в разных порядках, а не только индексы для отдельных столбцов: однако это, конечно, будет зависеть от точных запросов, которые вы хотите выполнить. – eggyal

+0

@eggyal Абсолютно верно. Здесь понимается шаблон доступа, и, когда он оценивается, может предложить другую схему. –

0

Вы сожалеете о создании составного первичного ключа, становится очень неприятным обращаться к отдельным строкам и производным индексам в MySQL, который должен содержать первичный ключ в качестве идентификатора строки. Однако вы можете создать UNIQUE.

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

Именно поэтому, когда это возможно, вы должны попытаться свести к минимуму размер вашего индекса.

+0

Я думаю, что для этого ответа может потребоваться хотя бы небольшая квалификация: например, если присутствует любое возможное значение в декартовом произведении кодомена основных составляющих столбцов (маловероятно в большинстве реальных сценариев), тогда соединение 4 х 4 байта значения будут не хуже (в размере или производительности индекса), чем любой другой ПК, который можно было бы спроектировать. – eggyal

+0

Никто не хранит несколько незадекларированных номеров в базе данных, этого просто не происходит. Это число настолько тупо огромно, что компьютер никогда не будет хранить столько данных. Помните, что большие ПК вызывают большие индексы. Держите ваши ПК как можно меньше. «INT» предпочтительнее, если вы действительно не нуждаетесь в «BIGINT». – tadman

+0

Достаточно честный. FWIW, я не спустил вниз. – eggyal

Смежные вопросы