2012-03-20 2 views
4

나는 다음과 같은 말한다 오라클 데이터베이스에 대한 제약 조건을 만들려고 해요 : 다음 column2column3의 조합은 모든 항목에 대해 고유해야합니다열 값에 따라 다중 열 제약 조건을 만들기

column1 == someValue 경우 column1 == someValue

고유 및 검사 제약 조건 개념을 잘 알고 있으며 이러한 제약 조건을 표현하려고 시도했습니다. 그러나, 나는 조건을 포함하는 방법을 찾을 수없는 것 같습니다. 그래서 그것이 가능한지 궁금해하는 이유입니다.

다음과 같은 클래스 계층 구조를 매핑 Hibernate에 의해 생성을 위해 내가 제약 조건을 만들려면 표 (간결 ommited 속성의 대부분) :

class MyClass { 
    String name; 
    MyClass parent; 
} 

class MySubClass extends MyClass { 
    String businessValue; 
} 

이 클래스는 하나의 테이블 전략을 사용하고 다른 사용하여 매핑된다 각 유형에 대한 판별 자 값. MySubClass의 모든 인스턴스에 대해 name과 parent의 조합이 고유해야한다는 고객 요구 사항입니다 (column1은 판별 자 값입니다). 테이블 제약 조건을 통해 부모 클래스에 이러한 제약 조건을 적용하기는 쉽습니다. 그러나 해당 제약 조건은 MySubClass에만 적용되어야합니다.

Hibernate Validator와 같은 프레임 워크를 사용하여 데이터베이스에 데이터를 입력하기 전에 데이터의 유효성을 검사 할 수 있습니다. 그러나 유효성 검사에는 데이터베이스 액세스가 필요하기 때문에 데이터베이스 제약 조건은 성능을 향상시키는 방법으로 보입니다.

create unique index mytable_idx on mytable 
    (case when column1 = 'somevalue' then column2 end 
    , case when column1 = 'somevalue' then column3 end 
    ); 

에만, 컬럼의 = 'someValue와'와 행에 대한 고유 인덱스 항목을 작성, :

+1

ORM 개발자가 데이터베이스 제약 조건을 사용하면 얻을 수있는 이점에 대해 매우 기쁘게 생각합니다. –

답변

5

당신은 제약 조건이 작업을 수행 할 수 있지만, 당신은이 같은 "function-based index" (FBI)을 사용하여 수행 할 수 있습니다 다른 행은 중복을 포함 할 수 있지만 그렇게 할 수는 없습니다.

+0

이러한 사례가 완전하지 않거나 뭔가 누락 되었습니까? –

+0

@Florin, 고마워요. - 슬픈 느낌이 요즘 내 대답의 특징이되고 있습니다 .-- ( –

+0

+1 좋은 구속 기법 –