2012-01-31 3 views
2

의 말을하자 나는이 있습니다다른 모든 외부 테이블을 사용하는 테이블을 만드는 방법은 무엇입니까?

CREATE TABLE `classes` 
(
    `class_ID` INT AUTO_INCREMENT, 
    FOREIGN KEY (`student_ID`) references `students`(`student_ID`), 
    PRIMARY KEY (`class_ID`) 
) 
ENGINE = InnoDB; 

여기 것은 각 클래스는 하나의 학생을 의미한다는 것이다. 그러나 나는 그것이 예를 들어, 학생들의 완전히 다른 테이블을 참조 할 :

CREATE TABLE `students` 
(
    `student_ID` INT AUTO_INCREMENT, 
    `name` VARCHAR(20) NOT NULL, 
    PRIMARY KEY (`student_ID`) 
) 
ENGINE = InnoDB; 

따라서, 나는 각 테이블은 클래스에 관련된 다수의 학생 테이블을합니다. 어떻게해야합니까? 각 클래스에 대해 하나의 테이블 (예 : students1, students2 등)을 선언해야합니까?

감사합니다.

+0

** 데이터베이스 정규화 ** 및 ** 다 대다 관계 **에 대한 연구를 수행하십시오. - 이것은 당신이 성취하고자하는 용어입니다. –

답변

3

이 답변은 처음에는 이해하기 어려울 것입니다. 잠시 후 자연스러워집니다. Is는 잘 알려진 디자인 패턴입니다. 각 학생 및 학생에 각 과목에 대한 행이이 테이블에서

create table students_in_courses(studentid, courseid) 

당신은 주위에이 문장을 설정할 수 있습니다 : 당신은 세 번째 테이블이 필요합니다. 각 코스에 대한 행이있는 각 학생 코스.

"링크 테이블"입니다. M : N 매핑에 사용됩니다.

학생들과 코스처럼이 테이블을 엔티티라고 생각할 수 있습니다. 추가 열을 추가 할 수도 있습니다.

create table students_in_courses(studentid, courseid, date_entered, date_exited, grade) 

일정한 수의 테이블이면 충분합니다.

다른 설명을 해봅시다 : 학생들이 행을, 행렬을 기둥으로하여 매트릭스를 저장하여 학생이 코스에있는 정보를 저장할 수 있습니다. 모든 세포에는 bool이 있습니다. 학생은이 과정에 있습니다. 예/아니오.

이제 우리는 다음과 같은 테이블이 전체 매트릭스를 저장 : 각 셀에 대한

create table students_in_courses(studentid, courseid, is_in_course bit) primary key(studentid, courseid) 

행. 이제 is_in_course = 0 인 모든 행을 삭제하고 그 행을 삭제합니다. 이제는 1을 포함하기 때문입니다. 우리는 원래의 솔루션으로 돌아 왔습니다. 우리의 "링크 테이블"은 두 테이블의 교차 곱 행렬의 0이 아닌 셀을 저장합니다.

3

아니요 외래 키 참조 두 테이블이 하나의 테이블 생성 :

CREATE TABLE students_classes (
    student_id int, 
    classes_id int, 
    PRIMARY KEY (student_id, classes_id), 
    FOREIGN KEY (student_id) REFERENCES students (student_ID), 
    FOREIGN KEY (classes_id) REFERENCES classes (class_ID) 
); 

당신이 클래스에 # 7 (# 53, 37 및 83) 학생 (예)를 가질 수있는 방법을, 학생 # 12 (클래스 # 53, # 212, # 7) 등등 ... 충돌없이.

+0

학생이 한 번에 한 클래스에만있을 수 있다면 'classID'필드를 student 테이블에 넣으면됩니다. –

+0

예, 실제로 작동합니다. 감사! –

관련 문제