2012-02-29 2 views
1

두 개의 테이블이 있다고 가정 해 보겠습니다. 표 1은 고유 ID (auto_increment)가있는 벤더 목록입니다. 표 2는이 벤더가 판매 할 수있는 장소 또는 시장 목록이며 고유 한 ID로도 판매됩니다. 벤더가 특정 시장에 있는지 여부에 빠르게 액세스 할 수 있기를 원합니다. 많은 벤더와 장소가있을 것입니다. 많은 응용 프로그램은이 정보에 액세스하여 다양한 목적으로 조작해야합니다. 나는 두 가지 접근법을 고려하고있다.Mysql - 공급 업체/장소 쌍 테이블을 처리하는 가장 효율적인 방법

접근 1 :

행이 장소에 공급 업체 및 컬럼에 대응하는 새 테이블을 확인합니다. 한 공급 업체의 장소 열에서 '1'은 해당 공급 업체가 해당 장소에 있음을 의미합니다. 즉, 공급 업체를 추가 할 때이 세 번째 테이블에 새 열을 만들 예정입니다. 나는 많은 공급 업체가있을 수 있습니다.

접근법 2 :

공급 업체 테이블의 장소라는 열 및 장소 테이블에있는 업체라는 열을 만듭니다. 구분 된 벤더 또는 지형지 물 목록으로 항목을 채 웁니다. 이것은 아마도 액세스하기가 더 어려울 것으로 보이지만, 어쩌면 터무니없는 수의 열이있는 새로운 테이블을 필요로하지는 않습니다.

각 코드를 구현하기위한 코드는 간단하므로 여기에 게시되지 않습니다. 제 질문은 "모범 사례"또는 효율성 문제에 관한 것입니다. 고맙습니다.

+0

여기에는 일반적인 합의가 있다고 생각하므로 정답을 선택하겠습니다. 참여해 주셔서 감사합니다. – buck54321

답변

4

이것은 다 대다 관계이므로 상호 참조 테이블을 사용해야합니다. 이 테이블에는 vendor_id와 venue_id라는 두 개의 열이 있으며 두 열 모두에 기본 키가 있습니다.

2

아니요.

외래 키 두 개의 열 (공급 업체 및 장소)이있는 세 번째 테이블이 있어야합니다.

이것은 standard approach이며 효율적입니다 (적어도 인덱스가 올바르게 설정되어있는 경우). 많은 수의 작은 행이 있을까 걱정하지 마십시오. (데이터를 추출하고 분할하고 새 쿼리를 작성하는 것이 훨씬 효율적입니다.)

+1

접근법 1은 상호 참조 테이블이 아니며 vendor_id, venue1 (bool), venue2 (bool), venue3 (bool) 등과 같습니다. –

+0

@RyanP - Ooops, 그래서 나는 질문을 잘못 읽었습니다. . – Quentin

+1

그래, 나는 거의 같은 일을했다. ;) –

1

접근 방법 3 :

두 개의 열이 중간 (또한 접합) 테이블을 확인 : vendor_idvenue_id 및 기본 키 (vendor_id, venue_id). 첫 번째 열은 FOREIGN KEY ~ vendor (vendor_id)이고 두 번째 열은 venue (venue_id)이 될 것입니다. 당신은 공급 업체가 공급 업체가 나타날 수 있습니다 어떤 경우 (즉, 장소에 대한 그 공급 업체 등) specifoc 장소, 담당자

1

판매를 시작했을 때 같은 추가 데이터를 저장하려면

또한 열을 추가 하나 이상의 장소에서? 과거/미래의 특정 날짜에 어떤 업체가 특정 장소에 있었는지 알고 싶다면 어떻게해야할까요?

N : M 관계를 분해하기 위해 세 번째 테이블 (장소 ID, 공급 업체 ID, 기타 열)을 사용하십시오. 여러 장소 나 여러 공급 업체를 단일 열에 저장하지 마십시오. boolean을 사용하지 않도록하십시오 - 일반적으로 의미가 없습니다 - MySQL에 관한 질문이 최소한 enum 유형을 사용하기 때문에.

관련 문제