2014-02-10 2 views
-1

매핑 테이블을 만들 때 사람들이 기본 키를 사용하지 않고 다른 키를 사용하는 것을 보았습니다. 어떤 이점을 제공하지 않고 그것을 제공하는 데 어떤 이점이 있습니다.매핑 테이블 SQL 자동 증가 된 열

나는 다른 테이블의 서로 게이트 키로 다시 매핑되는 두 개의 숫자 값이있는 간단한 매핑 테이블을 생각하고 있습니다. 가능하면

Cars 
id - 1 
name - Honda 

Car_Parts 
id - 3 
name - Hood 

Cars_Parts_Mapping 
cars_id - 1 
car_parts - 3 
+3

항상 기본 키를 사용하십시오. 이 경우 기본 키는'(cars_id, car_parts)'입니다. 두 세계의 장점 : 기본 키 및 추가 열이 없습니다. 그러나 많은 사람들이 자동 증가 정수 기본 키가있는 _extra_ 열을 만드는 이유는 _interface_를 작성하는 것이 게으르므로 _2_ 필드를 기반으로 행을 조작하는 것이기 때문입니다. – Wrikken

+0

"기본 키"가 "자동 시작 정수 열"과 같은 것으로 가정하는 것 같습니다. 그렇지 않습니다. Wrikken이 맞습니다 : 당신의 경우'(cars_id, car_parts)'*는 완벽한 기본 키입니다. –

+0

죄송합니다. 자동 증가 ID가 – Jason

답변

0

봅니다 기본 키를 사용합니다. 일반적으로 JOIN에서 가장 빠르며 독보적입니다.

최후의 수단으로 기본 키 이외의 다른 키와 연결해야합니다.

3

항상 기본 키를 사용 (업그레이드 된 의견은 대답). 이 경우 기본 키는 (cars_id,car_parts)입니다. 두 세계의 장점 : 기본 키 및 추가 열이 없습니다. 그러나 많은 사람들이 자동 증가 정수 기본 키가있는 추가 열을 만드는 이유는 한 필드가 아닌 두 필드를 기반으로 행을 조작하는 인터페이스를 작성하는 게으른 이유이기 때문입니다. PRIMARY KEY을 필요로

InnoDB 테이블에 특히 사실이다 : 한 정의하지 않는 경우, 엔진은 create a hidden one for you 것입니다 : 당신이 당신의 테이블에 대한 기본 키를 정의하지 않으면

, MySQL은 첫 번째에 위치 모든 키 열이 NOT NULL이며, InnoDB가 클러스터 된 인덱스로 사용하는 UNIQUE 인덱스.

테이블에 PRIMARY KEY 또는 적절한 UNIQUE 인덱스가없는 경우 InnoDB는 내부적으로 행 ID 값이 포함 된 합성 열에 숨겨진 클러스터 된 인덱스를 생성합니다. 행은 InnoDB가 그러한 테이블의 행에 할당 한 ID로 정렬됩니다. 행 ID는 새로운 행이 삽입 될 때 단조롭게 증가하는 6 바이트 필드입니다. 따라서 행 ID로 정렬 된 행은 물리적으로 삽입 순서입니다.

뿐만 아니라 역순 인덱스를 생성하여, 또한 빨리 (지금은 car_id에 검색에 잘 응답) car_parts 검색 할 수있는 테이블의 그 종류에 두 번째 인덱스를 정의하는 것은 드문 일이 아니다 : INDEX(car_parts,car_id). 그것은 INSERT '의 작은 성능 충돌을 의미하지만, 만약 당신이 SELECT 이상의 데이터를 조작한다면 (보통은 그렇습니다), 이것은 더 빠른 SELECT에 의해 정당화됩니다.

+0

그건 의미가 있습니다. 나는 innodb가 당신 뒤에서 당신을 위해 기본 열쇠를 추가한다는 것을 알지 못했습니다. 그런 다음 매핑 테이블에 기본 키를 갖지 않는 것이 좋습니다. – Jason