이 "매핑"테이블에 대해 별도의 ID 열이 필요합니까?


10

의 테이블 Producers과의 테이블이 Products있으며 둘 다 형식입니다.

  • Id -int, 기본 키
  • Name -nvarchar

생산자는 여러 제품을 운반 할 수 있으므로 다음과 같은 테이블을 만들려고합니다 ProducerDetails.

  • ProducerId -int, 외래 키 Producers.Id
  • ProductId -int, 외래 키 Products.Id

그런 다음 나 자신에게 질문하기 시작하여 전문가에게 물어볼 것이라고 생각했습니다. IdProducerDetails테이블에 추가 (int, 기본 키) 열 을 갖는 것이 더 나은 데이터베이스 디자인 입니까? 아니면 불필요합니까?

전혀 차이가 없다면 SQL Server 2008 R2를 사용하고 있습니다.

편집 -이 테이블 간의 관계는 다 대다라고 생각합니다. 죄송합니다. 명확하지 않았습니다. 생산자는 여러 유형의 제품을 운반 할 수 있으며 여러 다른 생산자가 동일한 제품을 생산할 수 있습니다.

이 질문이 지나치게 간단하면 참조 무결성 / 데이터베이스 디자인이 내 강점이 아닙니다 (죄송합니다).

답변:


6

생산자와 제품간에 일대 다 관계가있는 경우 (즉, 제품은 하나의 생산자에만 속할 수 있음) Products테이블 에 외래 키 참조를 직접 입력하는 것이 합리적입니다 .

일대 다

create table Producer
(
    id int identity(1, 1) not null primary key clustered,
    Name varchar(100) not null
)
go

create table Product
(
    id int identity(1, 1) not null,
    Name varchar(100) not null,
    ProducerId int not null foreign key references Producer(id)
)
go

그러나 이것이 다 대다 관계가 될 가능성이 있다면 가장 좋은 방법은 조인 테이블을 사용하는 것입니다.

다 대다

create table Producer
(
    id int identity(1, 1) not null primary key clustered,
    Name varchar(100) not null
)
go

create table Product
(
    id int identity(1, 1) not null primary key clustered,
    Name varchar(100) not null
)
go

create table ProductProducer
(
    ProductId int not null foreign key references Product(id),
    ProducerId int not null foreign key references Producer(id)
)
go

-- adding the primary key also ensures uniqueness
alter table ProductProducer
add constraint PK_ProductProducer 
primary key (ProductId, ProducerId)
go

조인 테이블을 사용하기로 결정한 경우 궁극적으로 고유 한 조합이므로 추가 키가 필요하지 않습니다 ProductId/ProducerId. 그것들을 복합 키로 사용할 수 있으므로에 추가 Id필드 가 필요하지 않습니다 ProductProducer.


1
당신은 그래도 실제 질문에 대답하지 않습니다-그는 id그의 관계 테이블에 필드를 갖는 데 어떤 가치가 있는지 묻고 있습니까?
JNK

@JNK 질문을 편집했습니다. 경우 ProductId, ProducerId독특한 조합이다, 나는 테이블에 참여하는 또 다른 인공 키를 추가 할 필요가 표시되지 않습니다. 합의? 그리고 질문을 오해하지 않는 한 OP는이 유스 케이스에 Join 테이블을 사용할 필요조차 없다고 생각합니다.
Thomas Stringer

알겠습니다. 설명해 주셔서 감사합니다. 내 답변의 해당 부분을 생략했습니다 (추가 참조를 위해 발자국이 있다고 생각되지만).
Thomas Stringer

7

아니요,이 테이블에 "기본 키"를 추가 할 가치가 없습니다. 당신의 조인은 오직 ProducerIDand 만 참조 할 ProductID것이므로 죽은 무게입니다. 이모.

@Shark에 동의하지만 기존 테이블의 스키마를 변경하지 않는 한 조인 테이블이 필요하지 않은 것처럼 보입니다.

따로, 식별자가 스키마 전체에 일관되게 이름이 지정되도록 기본 식별자의 이름을 전체 (예 : Products.ProductID대신 Products.ID) 로 지정하는 것이 좋습니다 .


@ jadarnel27 : 다른 모든 열의 경우 예, 나쁜 실천으로 간주됩니다. PK 열의 경우 많은 사람들이이 스타일 ( ProductID)을 선호합니다 . 한 가지 장점은을 볼 때 참조하는 SometableID테이블을 즉시 알 수 있다는 것입니다. 또 다른 방법은 Product JOIN ProducerDetail USING(ProductID)더 긴 구문 대신 구문을 사용할 수 있다는 것입니다.Product JOIN ProducerDetail ON Product.ID = ProducerDetail.ProductID
ypercubeᵀᴹ

죄송합니다. USING(ProductID)SQL Server에서 사용할 수 없으므로 해당 사항이 적용되지 않습니다.
ypercubeᵀᴹ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.