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

Ответ на это будет немного сложно понять вначале. Через некоторое время это становится естественным. Это хорошо известный дизайн. Вы нуждаетесь в третью таблице:

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. Мы вернемся к оригинальному решению. Наша «таблица ссылок» хранит ненулевые ячейки матрицы кросс-продуктов двух таблиц.

3

No. создать единую таблицу, которая имеет внешние ключи, ссылающиеся обе таблицы:

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» в таблицу учеников. –

+0

Да, это действительно сработает. Благодаря! –

Смежные вопросы