1-1 отношения всегда пахнут они должны быть объединены в одну таблицу. Это особенно важно, если они действительно 1-1 и не должны быть 1-0,1. В последнем случае, если изависимая информация может отсутствовать и в большинстве случаев будет отсутствовать, может быть полезно разделить ее на собственную таблицу. Но даже это можно выразить, указав значения null
определенным атрибутам.
Теперь, если по какой-то причине вы настаиваете на этих четырех таблицах, для первичных ключей есть два пути. Один из них - для зависимых таблиц - не объявлять первичный ключ как автоматически генерируемый, а просто как число и назначать ему автогенерированное значение записи стажера. Другим является автоматическое создание первичного ключа для каждой из зависимых таблиц и наличие внешнего ключа в таблице Intership для каждого из них. Поскольку я считаю всю конструкцию этих зависимых таблиц излишне сложной, я не могу дать рекомендации, какой из этих способов выбрать.
Есть еще одна проблема, связанная с вашей моделью данных. В ваших таблицах есть такие атрибуты, как answer1, answer2, ... Теперь, если у вас есть небольшая фиксированная сумма этих атрибутов, это может быть хорошо. Но у вас может быть более широкий набор фиксированных вопросов, возможно, для каждого типа интернатуры, который может варьироваться динамически и не может просто выражаться фиксированной структурой столбцов? В этом случае вам нужно будет что-то вроде
Question(id, text)
Internship(id, ...)
Answer(id, internship_id, question_id, student_answer, supervisor_evaluation)
Так что ваши кардинальность будет
Internship 1-----0,n Answer 0,n------1 Question
То же самое для других деталей стажировки.
Я, честно говоря, не против слияния их в один стол, но разве нет какого-то типа «правила», которое имеет такой большой стол? – Saverio
См. Мой отредактированный ответ для этого. – TAM
Все вопросы статичны. Они были те же самые более 5 лет. Тем не менее, я согласен с вами, я думаю, что есть лучший способ, чем то, что я сделал. Мое решение, о котором я подумал, делает назначениеId таким же, как internshipId, но не связывая их. Я просто использую поле со списком, чтобы выбрать интернатуру, и он будет вводить идентификатор в идентификатор назначения. – Saverio