2010-12-21 6 views
25

many-to-many 관계를 갖는 두 개의 객체를 가지고 있다면, 일반적으로 many-to-many 테이블을 사용하여 데이터베이스 스키마에서 그들을 모델링 할 것입니다. 그러나 many-to-many 테이블 (또는 "조인 테이블")은 자신의 기본 키 (정수 자동 증가)를 가져야합니까?여러 테이블에 기본 키가 있어야합니까?

예를 들어 테이블 A와 B가 있고 ID가 각각 A_ID (B_ID) 인 외래 키 튜플이있는 A_B라는 테이블이있을 수 있습니다. 하지만 A_B가 기본 키 자동 증분 ID 열을 소유하고 있어야합니까?

추가시 장점과 단점은 무엇입니까? 저는 개인적으로 many-to-many 조인을위한 natural 키를 좋아합니다. 그러나 기본 키를 추가하면 어떤 이점이 있습니까?

+1

중복 된 http://stackoverflow.com/questions/2190272/sql-many-to-many-table-primary-key. –

+0

이 질문을 삭제해야합니까? – ashes999

답변

17

나는 오뎃이

제외 말했다 모든 것에 동의 "그것은 합리적 중 하나 외래 키로 사용할 수 없습니다."

이 경우 그것은 당신의 독약을 선택합니다. 매핑 테이블은 절대적으로 부모가 될 수 있습니다. 그것은 다중 열 FK를 사용하는 어린이의 문제 일뿐입니다.

자동차와 색상의 간단한 경우를 생각해보십시오. 매년 Auto Maker에는 특정 팔레트 색상이 있으며 각 모델에는 해당 색상의 수가 제한되어 있습니다. 많은 - 많은 :: 색상 자동차 모델

그래서 이제는 새로운 자동차 주문이 저장되는 주문 테이블을 디자인하십시오.분명히 색상 및 모델이 주문 표에 표시됩니다. 해당 테이블 각각에 대해 FK를 만들면 데이터베이스에서 잘못된 모델/색상 조합을 선택할 수 있습니다. (물론 코드로이를 시행 할 수 있으므로 선언적으로 그렇게 할 수 없습니다.) 부모를 many : many 테이블로 만들면 지정된 조합 만 가져옵니다.

그렇다면 다중 열 FK가 있고 ModelID와 ColorID를 기반으로 작성된 PK를 가리 키시겠습니까? 아니면 단일 열 FK를 원하십니까?

독약을 고르십시오.

편집

하지만 뭔가의 부모가 아니라면, 어떤 테이블은 대리 키를 필요로하지 않는다.

+0

우수 사례. – ashes999

10

이러한 대리 키는 오버 헤드를 제외하고 아무 것도 추가하지 않습니다.

자연 키를 사용하여이 테이블에서 중복되는 부분이 있다면 복합 기본 키로 만듭니다. 이 키가 의미가있을 것입니다 응용 프로그램에서

을 사용하지 않은 남아 :

확장합니다.

의미있는 결과를 얻기 위해 쿼리에서 합리적으로 사용할 수 없기 때문에 데이터베이스에는 아무런 기능이 없습니다.

외부 키로도 합리적으로 사용할 수 없습니다.

+0

그래, 내가 볼 수있는 유일한 방법은 하나의 레코드로 삭제를 제한하려는 경우일지도 모른다.하지만 이는 외래 키 ID가 있다고 가정 할 때 ID에 대한 추가 조회를 유발할 수있다. 나는 동의한다. – ashes999

+1

@ ashes999 -이 테이블 (또는 해당 테이블)에 중복 행이 없어야합니다. 그리고 그렇지 않다면 하나의 행을 지우는 것만으로 두 외래 키가 모두 필요합니다. – Oded

0

실제로 아무 것도 유용하지 않습니다. "무언가"를 유일하게 나타내는 열쇠의 목적을 명심하십시오. 이와 같은 연관성 표는 그 자체로 "무언가"가 아니라 이미 키를 가지고있는 다른 두 가지 "somethings"에 대한 지속성 구조입니다. 영속성 매체 (데이터베이스) 밖에서는 의미를 가지지 않으며 실재로 존재하지도 (예 : 비즈니스 영역에서) 알려서는 안되기 때문에 (예 : 비즈니스 영역에서와 같이) 자체 ID.

+0

정확히 내 주장. 실제 개체는 ID를 식별해야합니다. – ashes999

+0

@ ashes999 : 예. 원래 질문으로 가면 별도의 기본 키를 이러한 테이블에 추가하는 것이 실제로 도움이되지 않는다고 생각합니다. @ dko의 제안은 내 의견으로는 이익보다 위험이 더 많습니다. 그것은 특정 상황에서 즉각적인 가치를 제공 할 수 있지만 그것이 열리는 문이 편안하지 않을 것입니다. – David

1

나는 두 가지 방법으로 모두 해왔습니다. 때로는 기능을 추가하는 것이 유용 할 때도 있습니다. 예를 들어, 테이블의 한 행에 2 개의 ID보다 더 많은 내용이 포함되어있는 시간이 있다면. 당신이 공간이 부족하지 않다면 나는 상처 입을 수 없기 때문에 거기에 하나를 넣을 것입니다. 때로는 최대 절전 모드 또는 ADO.NET과 같은 ORM 도구를 방해 할 수 있지만 이는 사소한 것입니다.

이렇게 요약하면 ... PROS 1. 잠재적 인 미래 성장을 가능하게합니다.

CONS 1. 공간 2. 일부 ORM 도구를 혼란스럽게합니다.

+1

잠재적 인 미래 성장에 관해서는 의미있는 데이터를 연결 테이블에 추가하자마자 지속성 로직 그 이상이됩니다. 자체 엔티티가됩니다. 이것은 도메인에서 두통을 일으킬 수 있습니다. 나는 비즈니스 로직을 영속 로직과 분리하여 분리하는 것이 최상이라고 생각한다. 관계 테이블에 데이터를 추가해야하는 경우 더 넓은 관점에서 자신이하고있는 일과 더 나은 방법이 있는지 다시 생각하십시오. 논리적 인 영향은 테이블에 열을 추가하는 것보다 큽니다. – David

+0

동의합니다. M : M 관계가 고유 한 기본 키가있는 엔터티가되는 예제를 생각하기는 어렵습니다. – ashes999

+0

충분히 공정하게, 나는 그런 식으로 결정을 내린 것에서 결코 두통이 없었습니다. 나는 다른 유용한 데이터를 포함하는 M : M 관계로 작동하는 엔티티를 가졌다. 이 데이터는 때로는 하나의 ID를 전달하는 것이 편리한 웹 페이지에서 편집되었습니다. – dko

1

"조인 테이블"이라는 용어가 자주 사용 되긴하지만 제대로 정의되거나 설명 된 적이 없다고 생각합니다. 개인적으로 나는 그 용어를 사용하지 않는다. 내가 이해 하듯이 "조인 테이블"은 두 개의 외래 키가있는 테이블을 의미합니다 (또는 두 개 이상일 수도 있음).

하나 이상의 외래 키가있는 테이블에서 키를 선택하는 기준은 다른 테이블과 거의 동일해야한다고 생각합니다. 고유하고 기약 적이 지 않은 것을 당신이 집행해야 할 의존성에 대해 자문 해보십시오. 친숙 함, 안정성 및 단순성 기준에 맞는 키를 선택하십시오. 사유가 필요한 경우에만 대리 키를 추가하십시오.

관련 문제