2010-03-16 4 views
3

나는 두 개의 테이블을 가진 데이터베이스를 가지고 있습니다 - 그것들을 Foo and Bar라고 부르 자. 각 foo는 임의의 수의 막대와 관련 될 수 있으며 각 막대는 여러 개의 foos와 관련 될 수 있습니다. 하나의 쿼리로 특정 바와 연관된 정보와 특정 foo와 연관된 정보를 검색 할 수 있기를 원합니다.데이터베이스 이론 - 두 테이블 사이의 관계

제 질문은 이러한 관계를 기록하는 가장 좋은 방법은 무엇입니까? 각 관계 레코드 (예 : 두 개의 열, foo 및 bar)가있는 별도의 테이블을 사용해야합니까? foo 테이블에 막대 목록에 대한 열이 있어야하며 반대의 경우도 마찬가지입니다. 내가 바라 보는 다른 옵션이 있습니까?

답변

11

다 대 다 관계라고합니다. "표준"솔루션은 관계가있는 각 행의 각 테이블에서 기본 키로 세 번째 테이블을 설정하는 것입니다.

세 번째 테이블을 접합 테이블이라고합니다. 위키 백과에서 "접합 테이블"예를 들어 http://en.wikipedia.org/wiki/Junction_table

는 :

Foo 
UID 
Col1 
Col2 

Bar 
UID 
Col1 
Col2 

Foo_Bar 
UID 
Foo_UID 
Bar_UID 

그래서, 위의, 많은 FOOS 많은 바있을 수 있습니다. Foo_Bar 테이블에는 막대와 관련된 각 foo와 foo와 관련된 막대가 모두 존재합니다.

select * 
from foo 
where uid in (
    select foo_uid 
    from foo_bar 
    where bar_uid=<some bar uid>) 

(.이 질문의 정확한 속는을 찾을 수 있지만, 다음과 같은 질문이 주제에 확장하지 않았나요)

: 주어진 표시 줄에 관련된 모든 FOOS을 얻으려면, 다음과 같은 SQL을 사용할 수 있습니다

Many to many table design question
Many to Many Relation Design - Intersection Table Design

+0

1) 나쁨 데이터베이스 구현 너무 많은 (단지 당신을 위해하지만, 다른 사람들이 미래에이를 볼 수 있음)이 최대를 가져하지 보았다 ** 오직 ** 부모의 PKs, ** 연관성 ** 테이블, 다 대다 관계를 해결하기 때문에; 다른 데이터가 들어 있으면 일반적인 "테이블"입니다. 이번 주에 위키가 무엇을 부를지 모릅니다. 2) 중복 된 행을 원한다면 PK는'(Foo_UID, Bar_UID)'입니다. 3) 'Foo-Bar.UID'는 100 % 중복되며, 추가 열 및 색인입니다. 아무 목적도 가지고 있지 않다. 제거 할 수 있습니다. – PerformanceDBA