2012-01-20 2 views
0

시스템 간의 인터페이스로 사용하는 데이터베이스 테이블이 있습니다. 나는 그것에 글을 쓴다. 테이블에 내 사용자 테이블을 참조하는 외래 키가 있습니다.대체 외래 키를 사용하여 데이터베이스 제한

이제 인터페이스가 점점 복잡 해지고 있습니다. 이제는 사용자 테이블을 참조하지 않는 인터페이스 테이블에 다른 용도가 있습니다. 물론 사용자 테이블에 외래 키 제약 조건을 완화 할 수 있습니다.

내가하고 싶은 일은이 외래 키가 만족되거나이 다른 키 (다른 열에 있음)가 충족된다는 제한 조건이 있습니다. 이것이 가능한가?

오라클 데이터베이스가 있습니다.

답변

0

새 인터페이스 요구 사항에 대해 다른 테이블을 만들 것입니다. 제약 조건의 한 가지 차이점은 또 다른 제약 조건으로 연결됩니다.

그런 다음 뷰를 만들어야하는지 여부를 생각하고 애플리케이션 소프트웨어를 기본 테이블 대신보기에서 읽게했습니다.

+0

보기 만들기가 가장 좋습니다. – Aaron

0

아니요, 불가능합니다. 은 하나 또는 다른 테이블로 연결되는 3 차 키 테이블에 해당하는 내용을 합친 것이지만 매우 지저분하고 부서지기 쉽습니다.

대신 매우은 현재 전략이 필요로하는 방식으로 조정할 수 없기 때문에 통합 전략을 재검토 할 것을 제안합니다.

+0

나는 그것이 진흙이라는 것에 동의한다. 그러나 두 테이블을 드러내는 것보다 더 많은 단서가 있습니까? – Aaron

3

두 열을 모두 null로 선언하고 두 열 중 정확히 하나가 NULL이 아닌지 확인하는 검사 제약 조건을 만들 수 있습니다. 예를 들어

, 나는 교수 및 강사에 대해 별도의 테이블을 가지고 있고 클래스가 교수 또는 강사하지만, 나는이

SQL> ed 
Wrote file afiedt.buf 

    1 create table professor(
    2 professor_id number primary key 
    3*) 
SQL>/

Table created. 

SQL> create table lecturer(
    2 lecturer_id number primary key 
    3 ); 

Table created. 

SQL> create table class(
    2 class_id number primary key, 
    3 lecturer_id number references lecturer(lecturer_id), 
    4 professor_id number references professor(professor_id), 
    5 check((lecturer_id is null and professor_id is not null) or 
    6   (lecturer_id is not null and professor_id is null)) 
    7 ); 

Table created. 

SQL> insert into professor values(1); 

1 row created. 

SQL> insert into lecturer values(20); 

1 row created. 

SQL> insert into class values(1, 20, null); 

1 row created. 

SQL> insert into class values(2, null, 1); 

1 row created. 

SQL> insert into class values(3, 20, 1); 
insert into class values(3, 20, 1) 
* 
ERROR at line 1: 
ORA-02290: check constraint (SCOTT.SYS_C0014175) violated 
처럼 뭔가를 할 수없는 모두를 할 수 있습니다 있도록 클래스를 모델링하고 싶다면

은 물론, 데이터 모델링 관점에서, 자주 LECTURER 또는 PROFESSOR 중 하나가되고 INSTRUCTOR에 nullable이 아닌 외래 키와 CLASS 테이블을 만들 수있는 INSTRUCTOR_TYPE 단일 INSTRUCTOR 테이블을 만들 수있는 더 좋은 생각이 될 것입니다 표.

관련 문제