Если студента может иметь самый больший одинсоветника, то это отношения один-ко-многим.
Обычный шаблон для реализации этой связи состоит в том, чтобы определить столбец внешнего ключа в дочерней таблице, таблицу на «много» стороне отношения. Например:
ALTER TABLE student ADD ad_id INT COMMENT 'fk ref advisor';
Кроме того, некоторые устройства хранения данных, такие как InnoDB, поддерживают и применяют внешние ключи. То есть, мы можем заставить базу данных вводить ограничения (ограничения) на значения, которые могут быть сохранены в столбцах, определенных как внешние ключи.
Например, мы можем установить правило, которое гласит, что значение, которое хранится в ad_id
столбце в таблице student
... должны быть найдено в строке в таблице advisor
, в ad_id
колонки.
Например:
ALTER TABLE student ADD CONSTRAINT fk_student_advisor
FOREIGN KEY (ad_id) REFERENCES advisor(ad_id)
ON DELETE RESTRICT ON UPDATE CASCADE
Это также обеспечивает соблюдение правила, что строка из таблицы advisor
не может быть удалена, если есть строки в таблице student
, которые ссылаются на это.
Этот же шаблон можно повторить для любого отношения «один ко многим». Например, если ученик может быть связан с не более один раздел, мы можем добавить внешний ключ таким же образом.
Если есть много-ко-многим, то мы вводим отношений таблицу, которая имеет внешние ключи, ссылающиеся на две связанные Entity таблицы.
Если студент может быть связано с нулевой, один или более разделе, и секции могут быть связаны с нулевой, один или более студента, что пример многие-ко-многим отношения.
Мы можем ввести новую таблицу, как это (в качестве примера):
CREATE TABLE student_section
(student_id INT NOT NULL COMMENT 'pk, fk ref student'
, section_id INT NOT NULL COMMENT 'pk, fk ref section'
, PRIMARY KEY (student_id, section_id)
, CONSTRAINT fk_student_section_student
FOREIGN KEY student_id REFERENCES student(s_id)
ON DELETE CASCADE ON UPDATE CASCADE
, CONSTRAINT fk_student_section_section
FOREIGN KEY section_id REFERENCES section(sec_id)
ON DELETE CASCADE ON UPDATE CASCADE
)
При том, что вместо того, чтобы установить связь между студентом и разделом мы вставить строку в новая таблица student_section
. Если ученик связан с другим секцией, мы добавляем еще одну строку в таблицу, ссылаясь на того же студента, но на другой раздел.
Значение, хранящееся в столбце student_id
, относится к строке в таблице student
; и значение, хранящееся в столбце section_id
, относится к строке в таблице section
.
(Отношение «многие ко многим» действительно состоит из строк в новой таблице, которая имеет отношение «один ко многим» к двум другим таблицам.)