2010-01-09 5 views
0

나는 현재 '친구'테이블 (many-to-many, 사용자간에 우정을 저장함)의 데이터베이스 디자인에 대해 생각하고있다.MySQL 테이블 디자인 : Primary Foreign Multi-Column Key가 가능합니까?

열 : user_id friend_id

는 다중 열 기본 키를 선호하는 것은 의미가 있습니까 대신 추가의 열을 'friendship_id'?

그렇다면 두 열 모두에 외래 키를 추가 할 수 있습니까?

답변

1

데이터베이스가이 작업을하기위한 가장 빠른 방법은 이것은 그들이 독특한 조합입니다 것을 보장하고, 동시에 모두 외래 키가 될 수

PRIMARY KEY ('user_id', 'friend_id') 

아마. 어쩌면 하나의 사용자를 찾기 위해 모든 친구를 빠르게 찾을 수 있도록 user_id에도 색인을 원할 수도 있습니다. 이 테이블을 유지 관련 추가 작업을 만들기 때문에

INDEX ('user_id') 

, 대리 키가 필요 없습니다. 어쨌든 조합은 고유 한 것이므로 이미 문제의 ID를 모두 알고 있습니다.

+0

외래 키에 대한 색인이 자동으로 생성되지 않습니까? 아마도 – Psaniko

+0

일 것입니다. 그러나 구체적이지는 않습니다. –

+0

아마도 "friend_id"에 대한 색인이 더 중요 할 것입니다. PK dclaration은 "user_id"및 "friend_id"순으로 색인을 생성하며, 해당 색인은 특정 user_id를 찾을 때 사용됩니다. 그러나 friend_id에 대한 조회에는 별도의 색인이 필요합니다. –

1

예, 실제로 두 개의 외래 키 열을 만들 수 있습니다. 이것은 종종이 연관성이 설계되는 방식입니다. 두 개의 열이 함께 고유하도록 (user_id, friend_id) 고유하도록 지정할 수도 있습니다.

편집 :이 예제가 될 수있다 :

CREAT TABLE friendship (
    user_id INT, 
    friend_id INT, 
    FOREIGN KEY (user_id) REFERENCES user(id), 
    FOREIGN KEY (friend_id) REFERENCES user(id), 
    UNIQUE(user_id,friend_id) 
); 
0

내가 단일 열 대용 키 (friendship_id) 플러스 고유 제한 조건과 user_id, friend_id 조합에 대한 인덱스 가고 싶어. 다른 테이블에서 대리모 (user_id은 아마도 iduser 등을 나타낼 것입니다.)를 사용하는 것 같아서 일관성을 위해 대리 키를 사용합니다.

0

우정 이벤트를 추적해야하는 경우 friendship_id를 가질 수 있습니다 (세부 정보에 대한 링크가있는 시스템에서 가장 최근의 우정을 나열하는 상자가 필요함). 그러나 데이터 모델에 그러한 관계가 필요하지 않은 경우, 다중 열 기본 키는 괜찮습니다. 당신이 그렇게처럼 만들 수 있습니다

create table friend (
    user_id int, 
    friend_id int, 
    foreign key (user_id) references user(id), 
    foreign key (friend_id) references user(id), 
    primary key (user_id, friend_id) 
); 

개별적으로 외래 키 제약 조건에 의해 만들어진 두 컬럼에 인덱스 및 USER_ID에 다중 열 고유 인덱스가있을 것입니다, friend_id.