2014-06-16 1 views
0

나는 졸업 프로젝트 관리 시스템의 DB를 구축 중입니다. 학생들은 그룹으로 나뉘어져 있습니다. 그룹 테이블과 교직원 테이블이 있습니다. 각 그룹에는 고문과 두 명의 심사관이 있습니다. 나는 여기서 혼란스러워. 교직원 테이블에서 3 개의 FK를 작성해야합니까? 시험관 2 명, 고문 1 명? 내 첫 코멘트를 참조 ...동일한 테이블의 여러 외래 키

create table groups 
(
    groupID    NUMBER    not null, 
    nbStudents   NUMBER    not null, 
    avgGPA    DOUBLE    NOT NULL, 
    projectName   varchar(50)   not null, 
    advisorID   NUMBER     
    examiner1ID   NUMBER 
    examiner2ID   NUMBER 
    primary key (groupID) 
); 
create table faculty 
(
    name    varchar(30)   not null, 
    facultyID   NUMBER(10)   not null, 
    email    varchar(30)   not null, 
    mobile    NUMBER(15)   not null, 
    type    varchar    
    primary key (facultyID) 
); 

alter table groups 
    add constraint FK_EX1 foreign key (examiner1ID) 
     references faculty (facultyID) ; 
alter table groups 
    add constraint FK_EX1 foreign key (examiner2ID) 
     references faculty (facultyID) ; 
alter table groups 
    add constraint FK_EX1 foreign key (advisorID) 
     references faculty (facultyID) ; 
+0

시작 다른 제약 조건에 대해 동일한 이름을 사용할 수 없습니다. 그리고 나는 당신이 그들 중 2 제약 1을 사용하여 작성 외국 키가 생각합니다. –

+0

심사관/고문을 여러 그룹에 지정할 수 있습니까? – natronite

+0

각자 교수진이있는 교수진 직원을위한 세 번째 테이블도 없습니까? 그러면 고문관과 심사관은 그룹과 교수진에 연결된 사람 일뿐입니다. 따라서 그룹에서 교수진으로 이동하려면 세 번째 테이블을 통과해야합니까? –

답변

0

편집 보류 : 여기

는 SQL 코드입니다.

외래 키를 찾으면 바로 상태를 지정하십시오.

외래 키는 테이블의 열 값이 해당 열이 키를 구성하는 다른 (가능하면 동일한) 테이블의 열 값으로 나타나야한다고 말합니다. 따라서 주어진 디자인에서 FK를 찾으면됩니다.

비록 이것이 실제로 FK가 아니지만. 첫째, SQL에서 FK 선언은 실제로 외국 수퍼 키를 선언합니다. 둘째, 해당 열은 NULL 일 수 있기 때문입니다. SQL은 어떻게 그것들을 검사 할 것인가를 말하며, 열이 NULL 일 때 검사하지 않으며, 그것이 당신이 원하는 것입니다. 그러나 그 제약은 단지 외래 (수퍼) 키가 아닙니다. SQL 데이터베이스에서이를 호출합니다.

애플리케이션 위치를 설명하는 구문을 찾은 다음 정상화하십시오.

본질적으로 다중 열이있는 것은 아닙니다. 그것은 common misconception입니다.

그러나 일반적으로 적어도 이상적인 디자인은 금지되어 있습니다. 상황에 대해 말할 필요가있는 모든 것에 대해 열 이름으로 매개 변수화 된 매개 변수화 된 문을 찾으십시오. 각 문장은 테이블을 얻습니다.

// group [groupID] contains [nbStudents] students .... and has advisor [advisorID] and ... 
groups(groupID,nbStudents,...,advisorID,examinerID) 

진술을 true로 만드는 행은 표로 이동합니다. 귀하의 응용 상황을 설명하는 데 필요한 모든 진술을 찾으십시오. 진술을 사실로 만드는 행을 테이블에 채우십시오.

간단한 문장을 찾아서 나중에 다시 정렬하십시오.

위의 문은 NULL이없는 행에만 해당됩니다. 그러나 당신은 가끔 그 역할에 교수가 없다고 말하고 싶습니다.

이상적으로 당신은 그룹별로 교수의 수에 대한 제약으로

// group [groupID] contains [nbStudents] students ... [projectName]) 
groups(groupID,nbStudents,...,projectName) 
// [facultyID] advises [groupID] 
advises(facultyID,groupID) 
// [facultyID] examines [groupID] 
examines(faculty,groupID) 

를 원한다. nulls가없는 관계형 디자인을 적절하게 작성하면 정규화하면 이런 종류의 간단한 것을 얻을 수 있습니다. 명령문/테이블의 수는 걱정하지 마십시오. 단지 애플리케이션의 복잡성을 반영합니다.

그러나 SQL DBMS는 일반적으로 쉽게 제약 조건을 지원하지 않습니다. 따라서 SQL 또는 성능과 관련한 특정 이유로 인해 우리는 재정렬 할 수 있습니다. 그러나 먼저 null이없는 디자인을하십시오. 즉, 간단한 진술 &을 선택한 다음 정규화하십시오. 그런 다음 제대로 재정렬하십시오. (SOI 재배치는 비정상화할 수 있지만이 특별한 경우는 아닙니다.)

Null은 복잡합니다.

null과 관련된 한 가지 문제는 테이블 의미가 복잡하다는 것입니다. 당신은 쿼리 할 때, 쿼리의 의미도 같이 복잡 위에 다시 간단한 테이블에 널 (null)을 절단하지 않는 한

//* 
    group [groupID] contains [nbStudents] students .... 
AND ( [advisorID IS NULL they have no advisor 
    OR [advisorID] IS NOT NULL AND advisor [facultyID] advises them) 
AND ( [examiner1ID IS NULL AND [examiner2ID] IS NULL and they have no examiner 
    OR [examiner1ID] IS NOT NULL AND [examiner2ID] IS NULL AND [examiner1ID] examines them 
    OR [examiner1ID] IS NULL AND [examiner2ID] IS NOT NULL AND [examiner2ID] examines them 
    OR [examiner1ID] IS NOT NULL AND [examiner2ID] IS NOT NULL 
     AND [examiner1ID] examines them AND [examiner2ID] examines them) 
*// 
groups(groupID,nbStudents,...,advisorID,examinerID) 

: 널 (null)와 귀하의 디자인은 사실이 진술을 행을 잡고 테이블 group 있습니다. 즉, 쿼리는 그와 같은 진술을하는 행을 제공합니다.

null이 SQL에 남아있을 때 이 아닌 복잡한 대답을 제공합니다.은 "... 및 교수진을 알 수 없음"을 의미합니다.

사람들은 이러한 기본 테이블에서 이러한 nulls 을 직관적으로 이해합니다. 그러나 먼저 간단하고 건전하게 디자인하십시오. 나중에 다시 정렬하십시오. 쿼리 할 때 Null이없는 부품을 적절하게 잘라내고 Null이없는 부품을 남겨 두어야합니다.

+0

자세한 답변을 보내 주셔서 감사합니다. 사실 심사관과 고문은 그룹이 프로젝트를 선택하고 관리자가 프로젝트를 완료 할 때까지 결정되지 않기 때문에 실제로 null을 유지했습니다. 그룹이 처음 만들어지면 고문이나 심사관이 없을 것입니다. 내가 맞습니까? – hzjw

+0

디자인에 대한 답변을 원하는 경우 (사용 의도에 따라 다름) 질문에 추가하거나 새로운 질문을하십시오. (그것은 단지 의견에 나타났습니다.) 그렇다면 대답 : a. 0 또는 3 이외의 null이있을 수 있습니까? b. 2 명 이상의 심사관이 심사관이 1 명 또는 2 명인지 여부와 상관없이 c. 1 명의 심사관과 함께 어떻게 null null을 선택해야합니까? – philipxy

+0

. 사실 모든 것은 null이 아니어야합니다. 그러나 그룹을 만든 직후가 아니라 채워질 것입니다. 이러한 속성의 가치는 나중에 발생하는 다른 작업 (그룹 선택 프로젝트 및 관리자에 의한 그룹 마무리)에 달려 있습니다. 중요하지 않습니다. 각 그룹마다 항상 2입니다. 내가 분명히했으면 좋겠어. – hzjw