짧은 버전
기존 다 대다 조인에서 각 쌍에 고정 된 수의 추가 속성을 추가해야합니다. 기본 다이어그램을 확장하여이를 달성하기위한 가장 좋은 방법은 옵션 1-4 중 아래 다이어그램으로 건너 뛰는 것입니다. 아니면 여기에 고려하지 않은 더 나은 대안이 있습니까?
더 긴 버전
현재 중간 조인 테이블을 통해 다 대 다 관계로 두 개의 테이블이 있습니다. 기존 객체 쌍에 속하는 속성에 대한 추가 링크를 추가해야합니다. 속성 테이블의 한 항목이 여러 쌍에 적용되거나 한 쌍에 여러 번 사용될 수도 있지만 각 쌍에 대해 고정 된 수의 속성이 있습니다. 이 작업을 수행하는 가장 좋은 방법을 결정하려고하는데 상황을 생각하는 방법을 정렬하는 데 문제가 있습니다. 의미 적으로 그것은 다음과 같이 잘 묘사 할 수있는 것처럼 보입니다.
- 고정 된 수의 추가 속성의 한 세트에 연결된 한 쌍
- 많은 추가 속성에 연결된 한 쌍
- 하나의 속성 집합에 연결된 많은 (2) 개체
- 많은 속성에 연결된 많은 개체
예
나는 각각 고유 ID를 가진 X와 Y의 두 가지 객체 유형 objx_objy
과 열이 있는 연결 테이블 x_id
과 y_id
로 구성되어 있으며 링크의 기본 키를 구성합니다. 각 X는 많은 Y와 관련 될 수 있으며 그 반대도 마찬가지입니다. 이것은 기존의 다 대 다 관계에 대한 설정입니다.
기본 케이스
이제 다른 테이블에 정의 된 속성 집합과 주어진 (X, Y) 쌍에 속성 P가 있어야하는 조건 집합이 있습니다. 조건 수는 고정되어 있으며 모든 쌍에 대해 동일합니다. 기본적으로 "상황 C1에서 쌍 (X1, Y1)에 속성 P1이 있음", "상황 C2에서 쌍 (X1, Y1)에 속성 P2가 있음"등이 있으며, 조인의 각 쌍에 대한 세 가지 상황 / 조건에 대해 표.
옵션 1
나의 현재 상황에서이 정확히 3 개 등의 조건은, 하나의 가능성은 열을 추가하는 것입니다 그래서, 즉 증가 할 것으로 예상 할 이유가 없다 c1_p_id
, c2_p_id
그리고 c3_p_id
에 featx_featy
주어진 위해 지정 x_id
하고 y_id
있는 재산, p_id
세 가지 각각의 경우에 사용하기에 .
이것은 기능에 적용된 모든 속성을 선택하기 위해 SQL을 복잡하게 만들고 더 많은 조건으로 쉽게 확장 할 수 없기 때문에 나에게는 좋은 생각처럼 보이지 않습니다. 그러나 (X, Y) 쌍당 특정 수의 조건이 필요합니다. 실제로, 여기서 유일한 옵션입니다.
옵션 2
조건 테이블을 작성 cond
하고 조인 테이블의 기본 키에 조건 ID를 추가하십시오.
이에 대한 한 가지 단점은 각 쌍의 조건 수를 지정하지 않는다는 것입니다. 다른 하나는 내가 초기 관계 만 고려할 때
SELECT objx.*, objy.* FROM objx
INNER JOIN objx_objy ON objx_objy.x_id = objx.id
INNER JOIN objy ON objy.id = objx_objy.y_id
그런 다음 DISTINCT
중복 항목을 피하기 위해 절 을 추가 해야합니다. 이것은 각 쌍이 한 번만 존재해야한다는 사실을 잃어버린 것 같습니다.
옵션 3
조인 테이블에서 새 '페어 ID'를 만든 다음 첫 번째 테이블과 속성 및 조건 사이에 두 번째 링크 테이블이 있습니다.
이것은 각 쌍에 대해 정해진 수의 조건을 시행하지 않는 것 외에 가장 적은 단점이있는 것 같습니다. 기존 ID 이외의 다른 것을 식별하는 새 ID를 작성하는 것이 의미가 있습니까?
옵션 4 (3b)
기본적으로 옵션 3과 동일하지만 추가 ID 필드를 만들지 않습니다. 이는 새 조인 테이블에 원래 ID를 둘 다 포함 x_id
하여 y_id
대신에 및 필드를 포함 하여 수행 됩니다 xy_id
.
이 양식의 또 다른 장점은 기존 테이블을 변경하지 않는다는 것입니다 (아직 프로덕션 상태는 아님). 그러나 기본적으로 전체 테이블을 여러 번 복제하거나 그런 식으로 생각하기 때문에 이상적이지 않습니다.
요약
제 느낌은 옵션 3과 4가 어느 쪽이든 갈 수있을 정도로 비슷하다는 것입니다. 속성에 대한 고정 된 작은 수의 링크가 필요하지 않다면 아마도 옵션 1이 다른 것보다 합리적으로 보일 것입니다. 매우 제한된 테스트를 기반으로 DISTINCT
쿼리에 절을 추가 해도이 상황에서 성능에 영향을 미치지 않는 것 같지만 배치로 인한 본질적 중복 때문에 옵션 2가 상황과 다른 상황을 나타내는 지 확실하지 않습니다. 링크 테이블의 여러 행에서 동일한 (X, Y) 쌍.
이러한 옵션 중 하나가 최선의 방법입니까, 아니면 고려해야 할 다른 구조가 있습니까?
DISTINCT
절, 내가 링크 # 2의 마지막에 하나, 같은 쿼리의 생각 x
과 y
를 xyc
참조하지 않습니다하지만 c
난 경우 ... 그래서 (x_id, y_id, c_id)
제약 UNIQUE
행에 (1,1,1)
와 (1,1,2)
다음 SELECT x.id, y.id FROM x JOIN xyc JOIN y
, 나는 다시 동일한 두 가지를 얻을 수 있습니다 행 (1,1)
및 (1,1)
.