여러 열을 기본 키로 사용하는 이유 (복합 기본 키)


109

이 예제는 w3schools에서 가져온 것 입니다 .

CREATE TABLE Persons
(
    P_Id int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255),
    CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
)

내 이해는 두 열이 함께 ( P_Id및 LastName) 테이블의 기본 키를 나타냅니다 Persons. 이 올바른지?

  • 누군가가 단일 열 대신 여러 열을 기본 키로 사용하려는 이유는 무엇입니까?
  • 주어진 테이블에서 기본 키로 함께 사용할 수있는 열은 몇 개입니까?


1
@Martijn 피터스. 답변이 삭제 된 이유는 무엇입니까?
— PerformanceDBA

답변:


119

이해가 정확합니다.

많은 경우에 이것을 할 것입니다. 한 가지 예는 같은 관계에 OrderHeader와 OrderDetail. 약동학에가 OrderHeader있을 수 있습니다 OrderNumber. 의 PK는 AND OrderDetail일 수 있습니다 . 둘 중 하나라면 고유하지 않지만 둘의 조합은 고유하게 보장됩니다.OrderNumberLineNumber

대안은 생성 된 (비 지능적인) 기본 키를 사용하는 것입니다 (예 :이 경우) OrderDetailId. 그러나 당신은 항상 관계를 쉽게 볼 수는 없습니다. 어떤 사람들은 한 가지 방법을 선호합니다. 일부는 다른 방법을 선호합니다.


2
branch_id를 사용하고 두 데이터베이스 사이에 복제를 사용하는 경우 이것이 유용합니까?
— Mhmd

11
생성 된 기본 키를 사용하는 대부분의 경우 복합 값에 대한 고유 키가 필요한 경우가 많습니다.
— Bacon Bits

"어떤 사람들은 한 가지 방법을 선호하고 어떤 사람들은 다른 방법을 선호합니다"에 대해 자세히 설명하십시오.
— 사용자 이름

1
정교하게 해주세요? 무엇을 말해야할지 모르겠습니다. 보고있는 내용을 직관적으로 이해하기 쉽기 때문에 여러 개의 연결된 필드를 키로 선호하는 사람들을 알고 있습니다. 입력하는 것이 더 쉽고 빠르기 때문에 각 행에 고유 키를 지정하는 것을 선호하는 다른 사람들을 알고 있습니다. 그것이 당신이 요구하는 것입니까?
— MJB

이 메시지는 @Username을위한 것입니다. 나는 그것을 지시하는 것을 잊었다.
— MJB

26

복합 기본 키의 또 다른 예는 연관 테이블의 사용입니다. 사람 집합이 포함 된 사람 테이블과 그룹 집합이 포함 된 그룹 테이블이 있다고 가정합니다. 이제 사람과 그룹에 다 대다 관계를 만들고 싶습니다. 각 사람이 여러 그룹에 속할 수 있음을 의미합니다. 다음은 복합 기본 키를 사용하는 테이블 구조의 모습입니다.

Create Table Person(
PersonID int Not Null,
FirstName varchar(50),
LastName varchar(50),
Constraint PK_Person PRIMARY KEY (PersonID))

Create Table Group (
GroupId int Not Null,
GroupName varchar(50),
Constraint PK_Group PRIMARY KEY (GroupId))

Create Table GroupMember (
GroupId int Not Null,
PersonId int Not Null,
CONSTRAINT FK_GroupMember_Group FOREIGN KEY (GroupId) References Group(GroupId),
CONSTRAINT FK_GroupMember_Person FOREIGN KEY (PersonId) References Person(PersonId),
CONSTRAINT PK_GroupMember PRIMARY KEY (GroupId, PersonID))

훌륭한 설명 : m-to-n 관계 (정규화 된 fasion에서)에 대한 속성의 필요성이 핵심이라고 생각합니다.
— Wolf

약간의 이익 설명을 추가하는 것이 더 좋을 것입니다
— Martian2049

10

W3Schools 예제는 복합 기본 키를 사용해야하는시기를 말하는 것이 아니라 다른 키와 동일한 예제 테이블을 사용하는 예제 구문 만 제공합니다.

그들이 선택한 예는 의미없는 키 (P_Id)와 자연 키 (LastName)를 결합하여 사용자를 오도 할 수 있습니다. 이 이상한 기본 키 선택은 다음 행이 스키마에 따라 유효하며 학생을 고유하게 식별하는 데 필요함을 나타냅니다. 직관적으로 이것은 말이되지 않습니다.

1234     Jobs
1234     Gates

더 읽을 거리 : 위대한 기본 토론 또는 Google meaningless primary keys또는 심지어 이것을 정독하십시오. SO 질문을

FWIW-내 2 센트는 다중 열 기본 키를 피하고 생성 된 단일 ID 필드 (대리 키)를 기본 키로 사용하고 필요한 경우 추가 (고유) 제약 조건을 추가하는 것입니다.


1
1) "대단한 기본 키 토론"링크는 특히 어리 석고, 정보는이기적이고 거짓입니다. 2) 행을 고유하게 만드는 열의 인덱스는 피할 수 없습니다. 인덱스가있는 "대리"ID는 항상 추가 열과 추가 인덱스입니다. 중복되기 때문에 오히려 어리석은. 그리고 천천히.
— PerformanceDBA

2
"위대한 기본 키 논쟁"은 어리석지 않습니다. SQL 개발자 또는 SQL DBA가 아니며 SQL에 모든 시간을 소비하지 않는 개발자의 매우 유효한 문제입니다. 순수한 SQL에서도 자연 키로 n 비트의 데이터를 전달하는 것을 기억해야하는 것보다 가입 할 때 기본 키로 의미없는 자동 생성 키를 사용하는 것이 좋습니다. 당신은 당신의 관점에 환영하지만 우리는 그렇게 무시하지 않는 것에 감사드립니다.
— Robert Paulson

4

여러 속성 조합의 고유성을 보장하고자 할 때마다 복합 키 (둘 이상의 속성이있는 키)를 사용합니다. 단일 속성 키는 동일한 결과를 얻지 못합니다.


1
고유 한 키를 보장하기 위해 논리적으로 복제 할 수없는 키를 형성하기 위해 두 속성의 조합에 의존 할 수 있습니다. 더 큰 데이터 세트의 Person 및 졸업 날짜가 그 예입니다.
— John Mark

3

예, 둘 다 기본 키를 형성합니다. 특히 서로 게이트 키 가없는 테이블에서는 각 레코드의 고유 식별자로 여러 속성을 지정해야 할 수 있습니다 (나쁜 예 : 이름과 성이 모두있는 테이블의 경우 두 속성의 조합이 독특한).


3

일반적으로 키의 여러 열은 대리 키보다 성능이 떨어집니다. 저는 서로 게이트 키와 다중 열 키에 대한 고유 인덱스를 선호합니다. 이렇게하면 더 나은 성능을 얻을 수 있고 필요한 고유성이 유지됩니다. 더 좋은 점은 해당 키의 값 중 하나가 변경 될 때 215 개의 하위 테이블에서 백만 개의 하위 항목을 업데이트 할 필요가 없다는 것입니다.


1
1) 성능. SQL 플랫폼이 아닙니다 ( "sql"및 프리웨어로 가장 할 수 있음). 2) 선호는 무관합니다. 무결성을 위해 테이블에 필요한 것은 관련이 있습니다. 3) 인덱스가있는 "대리"ID는 항상 추가 열과 추가 인덱스입니다. 따라서 모든 플랫폼에서 더 느릴 것입니다. 다시 성능, 당신은 자신과 모순됩니다. 4) 신화적인 "하위 테이블 215 개에있는 백만 개의 자식 항목"을 올바르게 업데이트하는 방법을 모르는 경우 질문하십시오.
— PerformanceDBA

2
나는 '키의 여러 열이 일반적으로 대리 키보다 성능이 떨어질 것입니다'라는 말에 동의하지 않습니다. 고려할 때 관계의 대리 키를 가져 오기 위해 종종 추가 쿼리가 필요합니다. 어느 시점에서 전체 추가 왕복 속도가 느려지는 것이 현명합니다.
— ttugates

3

두 번째 질문

주어진 테이블에서 기본 키로 함께 사용할 수있는 열은 몇 개입니까?

구현에 따라 다릅니다. 실제 사용중인 DBMS에 정의되어 있습니다. [1], [2], [3] 사용하는 데이터베이스 시스템의 기술 사양을 검사해야합니다. 일부는 매우 상세하고 일부는 그렇지 않습니다. 용어가 다양하기 때문에 이러한 제한 사항에 대해 웹을 검색하는 것은 어려울 수 있습니다. 복합 기본 키라 는 용어 는 필수 여야합니다.)

명시적인 정보를 찾을 수 없으면 테스트 데이터베이스를 만들어 제한 위반 (예상되는)에 대한 안정적이고 구체적인 처리를 기대할 수 있는지 확인하십시오. 이에 대한 올바른 정보를 얻으려면주의하십시오. 때때로 제한이 누적되고 다른 데이터베이스 레이아웃으로 다른 결과를 볼 수 있습니다.



2

관계형 데이터베이스에서 중간 테이블을 사용할 때 여러 테이블에서 기본 키를 사용하면 편리합니다.

예를 들어 이전에 만든 데이터베이스를 사용하고 특히 해당 테이블 내에있는 세 개의 테이블을 사용하겠습니다. 몇 년 전에 웹 만화 용 데이터베이스를 만들었습니다. 모든 만화, 제목, 이미지 파일 이름 등의 목록 인 "comics"라는 테이블 하나가 있습니다. 기본 키는 "comicnum"이었습니다.

두 번째 표는 이름과 간단한 설명 인 "문자"였습니다. 기본 키는 "charname"에 있습니다.

일부 예외를 제외하고 각 만화에는 여러 캐릭터가 있고 각 캐릭터가 여러 만화에 등장했기 때문에이를 반영하기 위해 "캐릭터"또는 "만화"에 열을 넣는 것은 비현실적이었습니다. 대신에 "comicchars"라는 세 번째 테이블을 만들었습니다.이 테이블은 어떤 만화에 어떤 캐릭터가 등장했는지 목록입니다. 이 테이블은 본질적으로 두 테이블을 조인했기 때문에 charname과 comicnum이라는 두 개의 열이 필요했고 기본 키는 둘 다에있었습니다.


1

단일 레코드를 구성하는 고유성 열 값을 보장하기 위해 복합 기본 키를 만듭니다. 중복되어서는 안되는 데이터의 삽입을 방지하는 제약입니다.

즉 : 모든 학생 ID와 출생 증명서 번호가 한 사람에게 고유하게 할당 된 경우. 그런 다음 다른 학생 ID와 동일한 출생 증명서를 가진 두 사람을 실수로 삽입하는 것을 방지 할 수 있으므로 개인의 기본 키를 학생 ID와 출생 증명서 번호의 조합으로 만드는 것이 좋습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.