Как создать таблицу, которая использует целую другую внешнюю таблицу? - PullRequest
2 голосов
/ 01 февраля 2012

Допустим, у меня есть это:

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;

Следовательно, я хочу несколько таблиц учеников, которые каждая таблица связана с классом. Как я могу это сделать? Нужно ли объявлять одну таблицу (например, студенты1, студенты2 и т. Д.) Для каждого класса?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 01 февраля 2012

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

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) и т. Д. ... без конфликтов.

3 голосов
/ 01 февраля 2012

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

create table students_in_courses(studentid, courseid)

В этой таблице у вас есть строка для каждого учащегося и каждого курса, в котором он учится. Вы можете перевернуть это предложение: Строка для каждого курса и каждого учащегося в этом курсе.

Это "таблица ссылок". Используется для отображений M: N.

Вы можете думать об этой таблице как о сущности, так же как студенты и курсы. Вы даже можете добавить дополнительные столбцы:

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

Достаточно постоянного числа таблиц.

Позвольте мне попробовать другое объяснение: мы могли бы сохранить информацию о том, какой студент находится в каком курсе, сохранив матрицу со студентами в виде строк и курсами в виде столбцов. В каждой камере есть бул: студент на этом курсе да / нет.

Теперь мы сохраняем всю эту матрицу в виде таблицы:

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

Для каждой ячейки по строке. Теперь мы удаляем все строки с is_in_course = 0 и удаляем этот столбец, потому что теперь он содержит только 1. Мы вернулись к первоначальному решению. Наша "таблица ссылок" хранит ненулевые ячейки матрицы перекрестных произведений двух таблиц.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...