2014-02-19 4 views
0

복합 키가 구성하는 열의 개별 값이 고유하거나 (열 값이 별도로 평가되는 경우) 합성 키가 고유하거나, 결과 값인 경우 (열 값 연결과 같이) 그 열쇠를 구성하고 고유해야합니다?복합 키는 어떻게 평가됩니까?

에서 더는, 예를 들어, 다음 두 행은 동일한 키 발생, 또는 그들은 모두 고유 한 것으로 간주하기 때문에 허용 될 수 : 이제

PRIMARY KEY (user_id, friend_id) 

|-----------|-------------| 
| user_id | friend_id | 
|-----------|-------------| 
| 10  |  283  | 
| 1028 |  3  | 
|-----------|-------------| 

, 나는 분명히 어떤 데이터베이스 전문가는 아니지만, 실제로는의 처음에는 복합 키를 사용하는 것에 대해 생각하고 있습니다. (전까지는 이유가 없었습니다.) 그래서 "모든 사람"이 알고 있거나 문서에서 찾기가 정말 쉽습니다. 그러나 대답을 찾을 수 없었습니다. 그것에.

위의 예제가 작동 할 것으로 예상됩니다 (논리적으로 왜 그렇지 않을까요? 별도의 값은 분명 고유합니다). 그러나 프로젝트를 진행하기 전에 확실히 알고 싶습니다.

+0

잘 모르겠지만, 열의 연결이 고유하면 복합 PK가 고유하다는 것을 알 수 없다고 생각합니다. 복합 PK의 개념입니다. 지금, 당신은 어떤 쿼리 (더 빠르게 쿼리를 만들기 위해)는 복합 해쉬를 계산하기 위해 복합 PK 컬럼들의 연결을 사용할 수 있다고 주장 할 수 있습니다. (이 경우에는 해시 함수가 독특하기는하지만이 해시도 고유하지 않습니다. 검색을 더 빨리 유지하기 위해 가능한 한 값을 분산 시키십시오.) – Leo

+0

INDEXES를 사용하여 복합 PK 검사의 속도를 높이려면 PostgreSQL 복합 PK 평가 내부에 대한 질문을 여기에 맞출 수 있습니다 :-) IMO – Leo

답변

2

PRIMARY KEY 제약 조건은 연관된 열의 UNIQUE 색인과 모든 관련 열의 NOT NULL 제약 조건에 의해 구현됩니다.

"고유"는 모든 열의 조합이 고유하다는 것을 의미합니다. 당신이 걱정하고있는 것은 두 값 ('10' || '283') = ('1028' || '3')의 텍스트 표현을 연결 한 것입니다.하지만 복합 유형이 전혀 작동하지 않습니다. 모든 필드는 텍스트 표현이 아닌 정의 된 데이터 유형의 값으로 별도로 간주됩니다.

NULL 값은 절대로 같지 않지만 pk 열에서는 허용되지 않습니다.

열 순서는 성능과 관련이 있습니다. 수반하는 합성 인덱스 환경 설정은 선행 열입니다. 이 밀접하게 관련된 답변에 대한 자세한 내용 :
PostgreSQL composite primary key

+0

좋습니다. 감사! 그게 내가 생각하고 기대했던 방식 이었지만, 그 전에 확실한 답을 찾을 수 없었습니다. 또한 링크에 감사드립니다. 물건을 정리 했어. – Tom

1

각 고유 제한 조건 (1 차 키 제한 조건 포함)은 관계의 각 행이 제한 조건에 명명 된 속성에 대한 투영에 기능적으로 종속되도록 요구합니다. 그게 무슨 뜻인지

는 예에서,

user_id | friend_id 
======= | ========= 
1  | 1 
1  | 2 
2  | 1 
4  | 5 

모두 허용한다는 것입니다; <user_id, friend_id>이므로 두 번 이상 나타납니다. 위의 경우 첫 번째 행과 충돌하기 때문에 다른 <1, 1>을 가질 수 없습니다.