[SQL] SQL - 대다 테이블의 기본 키
SQLSQL - 대다 테이블의 기본 키
이 질문은이 질문에 댓글을 읽은 후에 온다 :
데이터베이스 설계
당신은 다 대다 테이블을 만들 때, 당신은 두 개의 외래 키 열에 복합 기본 키를 생성한다, 또는 어쩌면 자동 증가 대리 "ID"기본 키, 그리고 두 FK 컬럼에 바로 넣어 인덱스를 생성 (및 고유 제한 조건)? 각각의 경우에 새 레코드 / 재 인덱싱을 삽입 성능에 미치는 영향은 무엇입니까?
기본적으로,이 :
PartDevice
----------
PartID (PK/FK)
DeviceID (PK/FK)
이 대 :
PartDevice
----------
ID (PK/auto-increment)
PartID (FK)
DeviceID (FK)
주석 기는 말한다 :
난 항상 어떤 대리 자동 증가 열이 복합 기본 키를 할 의향이 된 적이 있지만 대리 키가 실제로 더 성능이 좋은 경우 잘 모르겠어요 때문에 부탁 해요 이유입니다.
해결법
-
==============================
1.단순한 2 열 대다 매핑을, 나는 대리 키를 데 진짜 이점을 볼 수 없습니다. (COL1, COL2) (고유 참조 테이블에서 COL1과 COL2 값을 가정) 고유의 보장 (COL2, COL1)에 별도의 인덱스에 기본 키를 갖는 것은 반대 순서가 빠르게 실행됩니다 이러한 경우를 잡을 것입니다. 서로 게이트는 공간의 낭비이다.
단순한 2 열 대다 매핑을, 나는 대리 키를 데 진짜 이점을 볼 수 없습니다. (COL1, COL2) (고유 참조 테이블에서 COL1과 COL2 값을 가정) 고유의 보장 (COL2, COL1)에 별도의 인덱스에 기본 키를 갖는 것은 반대 순서가 빠르게 실행됩니다 이러한 경우를 잡을 것입니다. 서로 게이트는 공간의 낭비이다.
테이블이 오직 함께 두 개의 참조 테이블을 조인하는 데 사용되어야하기 때문에 당신은 각각의 컬럼에 인덱스를 필요가 없습니다.
당신이 질문을 참조 그 의견은 내 의견으로는, 사용하는 전자 가치가되지 않습니다. 저자는 테이블 배열보다는 매우 높은 성능 균형 멀티 웨이 트리 구조에 저장되어 생각하는 것 같은데.
처음에는, 그것은 저장하거나 테이블, 그냥 인덱스 정렬 얻을 필요는 결코 없다. 그리고 인덱스는 신속하게 검색 할 수 있도록 효율적으로 저장됩니다 순차적으로 저장되지 않습니다.
또한, 데이터베이스 테이블의 대부분은 훨씬 더 자주 기록보다 읽습니다. 차종 아무것도 당신은 삽입 측에서 어떤 것보다 훨씬 더 적절한 선택면에 않습니다.
-
==============================
2.어떤 대리 키는 링크 테이블에 대한 필요하지 않습니다.
어떤 대리 키는 링크 테이블에 대한 필요하지 않습니다.
(COL1, COL2) 및 (COL2, COL1)에 또 다른 고유 인덱스에 한 PK는 당신이 필요로하는 모든 것입니다
당신이 ORM을 사용하지 않으면 그 대처하고 당신을 위해 DB 설계를 지시 할 수 ...
편집 : 여기에 같은 대답 : SQL : 할 일을 당신이 많은-많은 테이블의 자동 증가 기본 키를해야합니까?
-
==============================
3.테이블이 참조되는 경우 증분 기본 키가 필요할 수 있습니다. 증분 기본 키를 사용하여 다른 테이블에서 뽑아 될 필요 대다 테이블의 세부 사항이있을 수 있습니다.
테이블이 참조되는 경우 증분 기본 키가 필요할 수 있습니다. 증분 기본 키를 사용하여 다른 테이블에서 뽑아 될 필요 대다 테이블의 세부 사항이있을 수 있습니다.
예를 들면
PartDevice ---------- ID (PK/auto-increment) PartID (FK) DeviceID (FK) Other Details
그것은 FK로 PartDevice.ID를 사용하여 '기타 세부 사항'을 끌어 쉽다. 따라서 증분 기본 키의 사용이 필요하다.
-
==============================
4.나는 귀하의 질문에 대답 할 수있는 가장 짧고 가장 직접적인 방법은 순차적 기본 키가없는 연결하는 두 테이블 경우 성능에 영향이있을 것이라고 말을하는 것입니다. 당신은 / 인용 한 바와 같이, 링크 테이블의 인덱스 중 하나 단편화 될 것이다, 또는 링크 테이블이 자신의 순차적 인 기본 키가없는 경우 DBMS는 레코드를 삽입하기 위해 더 열심히 일합니다. 이것은 대부분의 사람들이 링크 테이블에 순차적으로 증가 기본 키를 넣어 이유입니다.
나는 귀하의 질문에 대답 할 수있는 가장 짧고 가장 직접적인 방법은 순차적 기본 키가없는 연결하는 두 테이블 경우 성능에 영향이있을 것이라고 말을하는 것입니다. 당신은 / 인용 한 바와 같이, 링크 테이블의 인덱스 중 하나 단편화 될 것이다, 또는 링크 테이블이 자신의 순차적 인 기본 키가없는 경우 DBMS는 레코드를 삽입하기 위해 더 열심히 일합니다. 이것은 대부분의 사람들이 링크 테이블에 순차적으로 증가 기본 키를 넣어 이유입니다.
-
==============================
5.그것이 유일한 작업이 두 테이블을 연결하는 경우 것 같아 그래서, 최고의 PK는 이중 열 PK 될 것이다.
그것이 유일한 작업이 두 테이블을 연결하는 경우 것 같아 그래서, 최고의 PK는 이중 열 PK 될 것이다.
는 다른 용도로 사용하는 경우 그러나 외국 키와 두 번째 고유 인덱스와 PK로 다른 NDX를 추가합니다.
인덱스 또는 PK 확실히 더 중복이 없는지 확인하는 가장 좋은 방법입니다. PK는 마이크로 소프트 관리 Studio와 같은 도구가 당신을 위해 작업 (보기 생성)의 일부를 수행 할 수 있습니다
from https://stackoverflow.com/questions/2190272/sql-many-to-many-table-primary-key by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 하나 개의 컬럼에 대한 DISTINCT (0) | 2020.04.09 |
---|---|
[SQL] 데이터베이스 (1)를 사용하여 한 번에 적 있나요 : 1 개 관계가 의미가? (0) | 2020.04.09 |
[SQL] 두 날짜 사이의 날짜 범위에서 데이터를 선택합니다 (0) | 2020.04.09 |
[SQL] 기본 키 또는 고유 색인? (0) | 2020.04.09 |
[SQL] 저장 프로 시저를 작성하기 전에 존재하는지 확인하는 방법 (0) | 2020.04.09 |