2010-04-20 2 views
1

에, 내가 예를 들어 확인 (/ 트리거 O를 승) :고유 제한 문제를 설명하기 위해 "일대 다"관계

tag_bundle 하나의 구성 또는 하나 개 이상의 태그를. 고유 한 태그 조합은 고유 한 tag_bundle에 매핑 할 수 있으며 반대의 경우도 마찬가지입니다.

tag_bundle     tag   tag_bundle_relation 
+---------------+  +--------+  +---------------+--------+ 
| tag_bundle_id |  | tag_id |  | tag_bundle_id | tag_id | 
+---------------+  +--------+  +---------------+--------+ 
|  1  |  | 100 |  |  1  | 100 | 
+---------------+  +--------+  +---------------+--------+ 
|  2  |  | 101 |  |  1  | 101 | 
+---------------+  +--------+  +---------------+--------+ 
          | 102 |  |  2  | 101 | 
          +--------+  +---------------+--------+ 
              |  2  | 102 | 
              +---------------+--------+ 

태그 (101) 및 태그 (102)

에서 정확히 동일한 조합을 갖는 다른 tag_bundle 없을 수 101 태그 (100)와 태그로부터 정확히 동일한 조합을 갖는 다른 tag_bundle있을 수 없다 SQL을 실행할 때 이러한 고유 한 제약 조건을 어떻게 보장 할 수 "동시에" !! 이다 는 가 트리거 또는 명시 적 잠금 이외의 다른 해결책이, 동시에 정확히 같은 태그 조합이 작동하지 않는 테이블에 간단한 고유 제한 조건을 추가

두 번들을 추가 방지합니다.

나는이 간단한 방법으로 만 왔습니다 : 태그 조합을 문자열로 만들고, 그것을 고유 한 열로 만듭니다.

tag_bundle (unique on tags)   tag   tag_bundle_relation 
+---------------+-----------+  +--------+  +---------------+--------+ 
| tag_bundle_id | tags  |  | tag_id |  | tag_bundle_id | tag_id | 
+---------------+-----------+  +--------+  +---------------+--------+ 
|  1  | "100,101" |  | 101 |  |  1  | 101 | 
+---------------+-----------+  +--------+  +---------------+--------+ 
            | 100 |  |  1  | 100 | 
            +--------+  +---------------+--------+ 

하지만 좋은 방법 :(

+0

tab_id가 둘 이상의 번들에 참여하도록 허용 하시겠습니까? 예를 들어,'tag_bundle_id = 2'는'tags = (100, 200)'입니까? super-sets/subsets는'tag_bundle_id = 3는 태그 (100, 101, 102)를 가졌습니까? ' –

+0

tag_bundle_id = 2 태그 = (100, 200)이 허용되면 tag_bundle_id = 3 태그도 허용됩니다 (100, 101, 102). – elgcom

+0

그래서 하위 세트에 예 또는 아니요? – MkV

답변

1

데이터 중복의 비트와 함께 결합 그것으로 '트리거가없는'의 제약 조건은?, 당신은 당신이 필요로 얻을 수있는 이유를하지 보인다. 변경하여 '태그'필드를 INTEGER 배열 필드 (또는 tag_id 유형)에 매핑하십시오.

솔루션의 불쾌감을 인식하면서도 나는 그럴 수 없습니다. 대신에 배열을 사용하는 대신 'tags'에 대한 문자열, tag_bundle과 별도의 테이블에 넣기, 여전히 고유하게 만들고 tag_bundle_relation에 트리거를 넣어 array_agg (t ag_id) (> 8.4), 실패 할 경우 트리거 업데이트에 실패합니다.

-1

여러 트랜잭션이 테이블을 업데이트 할 때 올바르게 작동하려면 초기에 지연되는 지연 가능한 테이블을 생성해야합니다 (constraint trigger).

+1

잘못된 경우 수정하십시오. 함수 호출을 직렬화하지 않으면 트리거가 경쟁 조건에서 사용자를 저장하지 않습니다. 병렬로 실행되는 다른 트랜잭션의 변경 내용이 표시되지 않기 때문입니다. * 지연된 * 제약 조건 트리거 * 경합 조건에 대한 기회 창을 줄이지 만 서로의 (아직 커밋되지 않은) 데이터를 보지 않고도 이러한 트리거 두 개를 병렬로 실행할 수 있습니다. – intgr

+0

@intgr 우수 질문. 나는 답을 모른다. 필자는 트랜잭션 커밋이 직렬화되었다고 가정 했으므로 트랜잭션이 커밋 할 때 연기되는 트리거 함수도 처리됩니다. 아마도 Serializable Isolation Level이이를 보장해야합니다. 업데이트가 허용되는지 여부에 대한 결정이 다른 동시 트랜잭션이 커밋 또는 롤백하는지 여부에 따라 달라지면 다른 커밋 또는 롤백이 지연된 트리거와 함께 먼저 완료되어야합니다. –

관련 문제