2012-01-10 2 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

음, 왜 다른 테이블에서 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. 많은 사람들이 ID 필드를 기본 키와 혼동하는 것처럼 보입니다. 신원 필드는 쉽게 기본 키의 일부가 될 수 있습니다 (단, 테이블이 InnoDB이고 필드가 자동 증가 정수이면 접두어 여야 함).

0

기본 키가 항상 InnoDB의 2 차 인덱스의 마지막 키입니다 (옵티마이 저가 항상 이점을 취하지는 않지만). 키가 왼쪽 ID 가장 가까운 부분이 지정됩니다. 따라서 user_id에만 키를 만들거나 user_id/id에 대해 user_id, id에 대해 고유해야합니다. 그런 식으로 두 쿼리에서 인덱스를 사용할 수 있습니다. WHERE id =WHERE user_id =