복붙노트

[SQL] SQL - 대다 테이블의 기본 키

SQL

SQL - 대다 테이블의 기본 키

이 질문은이 질문에 댓글을 읽은 후에 온다 :

데이터베이스 설계

당신은 다 대다 테이블을 만들 때, 당신은 두 개의 외래 키 열에 복합 기본 키를 생성한다, 또는 어쩌면 자동 증가 대리 "ID"기본 키, 그리고 두 FK 컬럼에 바로 넣어 인덱스를 생성 (및 고유 제한 조건)? 각각의 경우에 새 레코드 / 재 인덱싱을 삽입 성능에 미치는 영향은 무엇입니까?

기본적으로,이 :

PartDevice
----------
PartID (PK/FK)
DeviceID (PK/FK)

이 대 :

PartDevice
----------
ID (PK/auto-increment)
PartID (FK)
DeviceID (FK)

주석 기는 말한다 :

난 항상 어떤 대리 자동 증가 열이 복합 기본 키를 할 의향이 된 적이 있지만 대리 키가 실제로 더 성능이 좋은 경우 잘 모르겠어요 때문에 부탁 해요 이유입니다.

해결법

  1. ==============================

    1.단순한 2 열 대다 매핑을, 나는 대리 키를 데 진짜 이점을 볼 수 없습니다. (COL1, COL2) (고유 참조 테이블에서 COL1과 COL2 값을 가정) 고유의 보장 (COL2, COL1)에 별도의 인덱스에 기본 키를 갖는 것은 반대 순서가 빠르게 실행됩니다 이러한 경우를 잡을 것입니다. 서로 게이트는 공간의 낭비이다.

    단순한 2 열 대다 매핑을, 나는 대리 키를 데 진짜 이점을 볼 수 없습니다. (COL1, COL2) (고유 참조 테이블에서 COL1과 COL2 값을 가정) 고유의 보장 (COL2, COL1)에 별도의 인덱스에 기본 키를 갖는 것은 반대 순서가 빠르게 실행됩니다 이러한 경우를 잡을 것입니다. 서로 게이트는 공간의 낭비이다.

    테이블이 오직 함께 두 개의 참조 테이블을 조인하는 데 사용되어야하기 때문에 당신은 각각의 컬럼에 인덱스를 필요가 없습니다.

    당신이 질문을 참조 그 의견은 내 의견으로는, 사용하는 전자 가치가되지 않습니다. 저자는 테이블 배열보다는 매우 높은 성능 균형 멀티 웨이 트리 구조에 저장되어 생각하는 것 같은데.

    처음에는, 그것은 저장하거나 테이블, 그냥 인덱스 정렬 얻을 필요는 결코 없다. 그리고 인덱스는 신속하게 검색 할 수 있도록 효율적으로 저장됩니다 순차적으로 저장되지 않습니다.

    또한, 데이터베이스 테이블의 대부분은 훨씬 더 자주 기록보다 읽습니다. 차종 아무것도 당신은 삽입 측에서 어떤 것보다 훨씬 더 적절한 선택면에 않습니다.

  2. ==============================

    2.어떤 대리 키는 링크 테이블에 대한 필요하지 않습니다.

    어떤 대리 키는 링크 테이블에 대한 필요하지 않습니다.

    (COL1, COL2) 및 (COL2, COL1)에 또 다른 고유 인덱스에 한 PK는 당신이 필요로하는 모든 것입니다

    당신이 ORM을 사용하지 않으면 그 대처하고 당신을 위해 DB 설계를 지시 할 수 ...

    편집 : 여기에 같은 대답 : SQL : 할 일을 당신이 많은-많은 테이블의 자동 증가 기본 키를해야합니까?

  3. ==============================

    3.테이블이 참조되는 경우 증분 기본 키가 필요할 수 있습니다. 증분 기본 키를 사용하여 다른 테이블에서 뽑아 될 필요 대다 테이블의 세부 사항이있을 수 있습니다.

    테이블이 참조되는 경우 증분 기본 키가 필요할 수 있습니다. 증분 기본 키를 사용하여 다른 테이블에서 뽑아 될 필요 대다 테이블의 세부 사항이있을 수 있습니다.

    예를 들면

    PartDevice
    ----------
    ID (PK/auto-increment)
    PartID (FK)
    DeviceID (FK)
    Other Details
    

    그것은 FK로 PartDevice.ID를 사용하여 '기타 세부 사항'을 끌어 쉽다. 따라서 증분 기본 키의 사용이 필요하다.

  4. ==============================

    4.나는 귀하의 질문에 대답 할 수있는 가장 짧고 가장 직접적인 방법은 순차적 기본 키가없는 연결하는 두 테이블 경우 성능에 영향이있을 것이라고 말을하는 것입니다. 당신은 / 인용 한 바와 같이, 링크 테이블의 인덱스 중 하나 단편화 될 것이다, 또는 링크 테이블이 자신의 순차적 인 기본 키가없는 경우 DBMS는 레코드를 삽입하기 위해 더 열심히 일합니다. 이것은 대부분의 사람들이 링크 테이블에 순차적으로 증가 기본 키를 넣어 이유입니다.

    나는 귀하의 질문에 대답 할 수있는 가장 짧고 가장 직접적인 방법은 순차적 기본 키가없는 연결하는 두 테이블 경우 성능에 영향이있을 것이라고 말을하는 것입니다. 당신은 / 인용 한 바와 같이, 링크 테이블의 인덱스 중 하나 단편화 될 것이다, 또는 링크 테이블이 자신의 순차적 인 기본 키가없는 경우 DBMS는 레코드를 삽입하기 위해 더 열심히 일합니다. 이것은 대부분의 사람들이 링크 테이블에 순차적으로 증가 기본 키를 넣어 이유입니다.

  5. ==============================

    5.그것이 유일한 작업이 두 테이블을 연결하는 경우 것 같아 그래서, 최고의 PK는 이중 열 PK 될 것이다.

    그것이 유일한 작업이 두 테이블을 연결하는 경우 것 같아 그래서, 최고의 PK는 이중 열 PK 될 것이다.

    는 다른 용도로 사용하는 경우 그러나 외국 키와 두 번째 고유 인덱스와 PK로 다른 NDX를 추가합니다.

    인덱스 또는 PK 확실히 더 중복이 없는지 확인하는 가장 좋은 방법입니다. PK는 마이크로 소프트 관리 Studio와 같은 도구가 당신을 위해 작업 (보기 생성)의 일부를 수행 할 수 있습니다

  6. from https://stackoverflow.com/questions/2190272/sql-many-to-many-table-primary-key by cc-by-sa and MIT license