2010-01-24 4 views
4

예를 들어이 표를 사용하십시오.많은 관계가있는 SQL에 두 개의 테이블이있는 경우 추가 테이블을 만들어야합니까?

Item 
    id 
    description 
    category 

Category 
    id 
    description 

항목은 많은 범주에 속할 수 있으며 범주는 분명 많은 항목에 첨부 될 수 있습니다.

이 상황에서 데이터베이스를 만드는 방법은 무엇입니까? 나는 잘 모르겠다. 누군가 제 3의 테이블을 만들겠다고 말했지만 그렇게해야합니까? 나는 그대로

세 번째 테이블 테이블 즐 즐

를 작성해야합니까?

item_id  (Foreign Key) 
category_id (Foreign Key) 

편집 :

답변

4

예, 당신은 ID의 매핑과 같은 열이 뭔가 세 번째 테이블을 만들 필요가 기본 키로 ITEM_ID 및 CATEGORY_ID 처리 할 수 ​​있습니다, 그들이 유일하게 혼자 기록을 확인합니다. 일부 응용 프로그램에서는 레코드 자체에 대해 숫자 식별자를 추가하는 것이 유용하다는 사실을 알았습니다. 그렇게하는 경우 옵션으로 숫자 식별자를 포함 할 수 있습니다.

이 테이블을 항목 및 테이블 사이의 모든 매핑 목록으로 생각하십시오. 카테고리. 간결하며 쿼리가 쉽습니다.

편집 : 삭제 (불필요) 기본 키.

+0

mapping_id가별로 필요하지 않습니다. 매핑은 항목과 범주에 의해 고유하게 표현되므로 기본 키 (함께)와 외래 키 (각 혼자)의 쌍을 단순하게 만들 수 있습니다. –

+0

@Max, 필자가 정기적으로 볼 수있는 많은 관계가 종종 하나의 숫자 식별자를 사용하는 것이 유익한 습관의 힘입니다. –

2

예, "조인 테이블"이 필요합니다. 일대 다 관계에서 "많은"측면에있는 객체는 "한쪽"에있는 객체에 대한 FK 참조를 가질 수 있으며, "많은"객체 각각이 하나의 "하나"의 객체를 가진다.

many-to-many 관계에서는 하나의 필드에 여러 개의 FK 참조를 채울 수 없기 때문에 더 이상 충분하지 않습니다. (음, 그렇지만 관계형 데이터베이스와 함께 제공되는 훌륭한 데이터와 모든 데이터의 원 자성을 잃을 수 있습니다. join 테이블이 들어 오면

이다 - ItemCategory 간의 각 관계에 대한 상기 관계는 한 쌍으로 결합 표에 표시된다 Item.id X Category.id.

3

예, 두 테이블만으로 두 테이블간에 세 번째 정규형 일대 다 관계를 형성 할 수는 없습니다. 당신 형성 할 수있는 일대 진정한 대다, 당신은 같은 것을 필요로 (두 방향 중 하나)하지만 얻기 위해 :

Item 
    id primary key 
    description 

Category 
    id primary key 
    description 

ItemCategory 
    itemid  foreign key references Item(id) 
    categoryid foreign key references Category(id) 

을 당신은 범주가 필요하지 않습니다 항목 테이블에 여기에 해당하지 않는 항목에 대한 권한있는 범주가없는 경우 나는 또한 조인 테이블에 이미 "진짜"고유 키가있을 때 불필요한 기본 키를 도입하는 것을 크게 좋아하지 않습니다. 항목 ID와 범주 ID가 이미 고유하다는 사실은 ItemCategory 테이블의 전체 레코드도 고유하다는 것을 의미합니다.

표준 도구를 사용하여 ItemCategory 테이블의 성능을 모니터링하기 만하면됩니다.

  • 가 사용하는 쿼리에 따라
  • 카테고리 ID
  • (상품 ID, 카테고리 ID)
  • (카테고리 ID, 상품 ID)

을 항목 ID : 당신이 중 하나 이상에 인덱스를 요구할 수있다 데이터를 조인 할 수 있습니다 (그리고 복합 인덱스 중 하나가 기본 키가됩니다).

전체 작업에 대한 실제 구문의 라인을 따라 다음과 같습니다 신원/자동 증가 컬럼으로 ID 열을 만드는 등 고려해야 할 것들의

create table Item (
    id   integer  not null primary key, 
    description varchar(50) 
); 
create table Category (
    id   integer  not null primary key, 
    description varchar(50) 
); 
create table ItemCategory (
    itemid  integer  references Item(id), 
    categoryid integer  references Category(id), 
    primary key (itemid,categoryid) 
); 

있어 다른 종류의,하지만 직접 아니다 수중에있는 질문과 관련이 있습니다.

관련 문제