편집 보류 : 여기
는 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이없는 부품을 남겨 두어야합니다.
시작 다른 제약 조건에 대해 동일한 이름을 사용할 수 없습니다. 그리고 나는 당신이 그들 중 2 제약 1을 사용하여 작성 외국 키가 생각합니다. –
심사관/고문을 여러 그룹에 지정할 수 있습니까? – natronite
각자 교수진이있는 교수진 직원을위한 세 번째 테이블도 없습니까? 그러면 고문관과 심사관은 그룹과 교수진에 연결된 사람 일뿐입니다. 따라서 그룹에서 교수진으로 이동하려면 세 번째 테이블을 통과해야합니까? –