2011-12-26 1 views
1

좋습니다. 상황이 있습니다.복합 기본 키와 고유 키를 외래 키로 사용

  • 대학에는 한 명 이상의 교수가 있습니다.
  • 각 교수진에는 여러 부서가 있습니다.

저는 중복 된 교수 또는 부서를 원하지 않습니다. 그래서 아래 세 표를 정의했습니다.

CREATE TABLE university (
    id INT PRIMARY KEY AUTO_INCREMENT, 
    long_name VARCHAR(255) UNIQUE NOT NULL, 
    name VARCHAR(255) NOT NULL, 
    country VARCHAR(45) NOT NULL, 
) Engine=InnoDB; 

CREATE TABLE school_faculty (
    id INT UNIQUE NOT NULL AUTO_INCREMENT, 
    name VARCHAR(45), 
    universityID INT, 
    PRIMARY KEY (name, universityID), 
    FOREIGN KEY (universityID) REFERENCES university (id) 
) Engine=InnoDB; 

CREATE TABLE department (
    id INT PRIMARY KEY AUTO_INCREMENT, 
    name VARCHAR(45) NOT NULL, 
    schoolfacultyID INT NOT NULL, 
    FOREIGN KEY (schoolfacultyID) 
     REFERENCES school_faculty (id) 
) Engine=InnoDB; 

더 좋은 방법이 있는지 말해주세요. 나는 그걸로 고군분투하고있다.

+0

게시물의 시작 부분에있는 두 개의 글 머리 기호를 기반으로 지금까지 올바른 것으로 보입니다. – TetonSig

+2

적절한 [샘플 코드] (http://sscce.org/) (여기서는 SQL 문)가 임의의 스키마 및 샘플 데이터 형식보다 유용합니다. 샘플에'CREATE TABLE'을 사용하십시오. – outis

+0

updated : table structure attached – stanchen

답변

0

괜찮아요.

그냥 falculty/department 이름의 테이블을 가지고 부서/전산 테이블을 (universityID, facultyNameID)로 변환하여 좀 더 정상화 할 수 있습니다. 그러나 정상화의 수준은 아마도 과잉이다. 모든 대학에서 Physics 또는 Basket Weaving 교수진이 한 명 더 많을 가능성이 있지만, "Physics"라는 단어를 여러 번 복사하여 사용하는 추가 바이트는 은행을 해체하지 않습니다.

동일하게 부서에 적용되며 같은 "문제가 아닐 수도 있습니다".

+0

나는 교수 또는 부서가 중복되기를 바란다. 자동 증가 고유 키가 기본 키이고 다른 두 열이 복합 기본 키인 테이블을 갖는 것이 왜 좋지 않은지 알 수 없습니다. (이 경우 Faculty Table) – stanchen

+0

대리 키라고합니다.전체 대학/학부/부서 키 집합을 드래그하지 않고 단일 ID 필드를 둘러 보는 것이 더 쉽습니다. 특히 부서 ID를 다른 곳의 외래 키로 사용할 때 특히 더 쉽습니다. –

+0

동의합니다! 그건 대용 암호 키를 가지고있는 나의 요지입니다. 방금 원본 구조를 테이블 구조 이미지로 업데이트했습니다. 그래서 제 디자인에 따르면 제대로 구조화되어 있습니까? 더 좋은 방법이 있니? – stanchen

-1

school_faculty 테이블을 제외하고 괜찮습니다. 다음 스키마를 사용하는 것이 좋습니다.

CREATE TABLE school_faculty (
    id PRIMARY KEY AUTO_INCREMENT, 
    name VARCHAR(45), 
    universityID INT, 
    UNIQUE (name, universityID), 
    FOREIGN KEY (universityID) REFERENCES university (id) 
) Engine=InnoDB; 

복합 키 대신 PK로 정수 열을 사용하는 것이 좋습니다. InnoDB 테이블에서 PK는 clustered index이므로 PK에 가장 작은 데이터 유형을 사용하면 MySQL이 스캔 당 인덱스에서 더 많은 데이터를 읽을 수 있음을 의미합니다. 대부분의 경우 기본 키가 자동으로 증가하는 것이 좋으며, 이는 쉽게 정렬 할 수 있습니다 (기본적으로 이미 정렬되어 있음).

또한 보조 (클러스터되지 않은) 인덱스는 PK의 데이터를 저장합니다. 더 작은 유형을 사용하면 2 차 인덱스가 더 적은 공간을 차지한다는 의미입니다. 보조 인덱스를 사용하는 쿼리는 PK를 사용하여 실제 행 데이터에 액세스해야하므로 PK를 통해 액세스 시간을 향상시키는 모든 기능을 활용할 수 있습니다.

또한 주어진 교수진에서 부서가 중복되지 않도록 부서 (이름, schoolfacultyID)에 고유 키를 추가해야합니다.

희망이 있습니다.

+0

만약 내가 그렇게한다면, 그것은 같은 university_id와 다른 faculty_name을 허용하지 않을 것입니다. – stanchen

+0

이것은 좋지 않은 디자인입니다. 명시된 대학과 완전히 다른 대학에있는학과에 배정 된학과를 가질 수 있습니다. –

+0

@stanchen : school_faculty (name, universityID)의 고유 색인이 복합이기 때문에 그렇지 않습니다. – outis