2012-01-10 1 views
0
DROP TABLE IF EXISTS `media_publications`; 
CREATE TABLE `media_publications` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `media_id` int(11) NOT NULL, 
    `user_id` int(11) NOT NULL, 
    `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `description` varchar(1000) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY (`id`,`user_id`) 
) ENGINE=INNODB; 

Было бы бессмысленно иметь здесь id в качестве первичного ключа? Должен ли я просто иметь id + user_id в качестве основного ключа, учитывая, что он мне нужен как внешний ключ для другой таблицы?Практика первичного ключа

+0

Ухм, почему просто 'id' недостаточно для FK в этой другой таблице? – zerkms

+1

Является ли комбинация 'media_id' и' user_id' уникальной идентификацией строки? – Oded

+0

С движком InnoDB вы почти никогда не ошибетесь в настройке PK как поля auto_increment. –

ответ

2

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

+0

Зачем ставить user_id первым? –

+0

@amiawizard: поэтому он полезен для запросов на user_id сам по себе – gbn

0

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

0

Рекомендуется указывать первичный ключ в качестве первичного ключа.

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

P.S. многие люди, похоже, путают поля идентичности с первичными ключами. Поле идентификации легко может быть частью первичного ключа (но должно быть префиксом, если в таблице находится InnoDB, и поле является автоинкрементным целым числом).

0

Нет смысла указывать ключ на id, user_id, поскольку первичный ключ всегда является последним ключом вторичных индексов в InnoDB (хотя оптимизатор не всегда использует это преимущество), а так как ключ может использоваться только в том случае, если левый указана самая большая часть. Таким образом, либо создавайте ключ только на user_id, либо он должен быть уникальным по сравнению с user_id/id, на user_id, id. Таким образом, вы можете использовать индекс в обоих запросах WHERE id = и WHERE user_id =