Любое отношение требует, чтобы у «родительской» таблицы (с одной стороны) был первичный (или уникальный) ключ (PK), который однозначно идентифицирует каждую строку, а у «дочерней» таблицы (с другой стороны) есть внешний ключ столбец или столбцы, которые должны заполняться значениями, которые совпадают с некоторыми существующими значениями [первичного ключа] в родительской таблице. Если вы хотите, чтобы отношение «один ко многим» (1-M), тогда внешний ключ должен быть обычным атрибутом (столбец или столбцы) в дочерней таблице, который может повторяться (может быть много строк с одинаковым значением)
Если вы хотите, чтобы отношение один к одному (1-1), тогда внешний ключ сам по себе должен быть первичным ключом или уникальным индексом в дочерней таблице, что гарантирует, что в дочерней таблице может быть не более одной строки с этим значением .
Отношение 1-1 эффективно разделяет атрибуты (столбцы) в таблице на две таблицы. Это называется вертикальной сегментацией. Это часто делается для подклассификации сущностей таблицы или, по другой причине, если шаблоны использования в столбцах таблицы указывают на то, что к нескольким столбцам нужно обращаться значительно чаще, чем к остальные столбцы. (Скажем, один или два столбца будут доступны 1000 раз в секунду, а остальные 40 столбцов будут доступны только один раз в месяц). Таким образом, разбиение таблицы таким образом оптимизирует схему хранения для этих двух разных запросов.
Sub-причислять . Вышеприведенное фактически создает отношение от 1 до 0 или одно, которое используется для того, что называется отношением подкласса или подтипа. Это происходит, когда у вас есть две разные сущности, которые имеют большое количество атрибутов, но одна из сущностей имеет дополнительные атрибуты, которые не нужны другой. Хорошим примером могут быть Сотрудники и SalariedEmployees . Таблица Employee будет иметь все атрибуты, которые имеют все сотрудники, а таблица SalariedEmployee будет существовать в (1-0 / 1) отношении с сотрудниками с дополнительными атрибутами ( Заработная плата , Ежегодный отпуск и т. Д.), Которые нужны только наемным работникам.
Если вы действительно хотите связь 1-1, то вам нужно добавить еще один механизм, чтобы гарантировать, что дочерняя таблица всегда будет иметь одну запись для каждой записи / строки в родительской таблице. Как правило, единственный способ сделать это - применить это в коде, используемом для вставки данных (в триггере, хранимой процедуре или в коде вне базы данных). Это связано с тем, что если вы добавили ограничения ссылочной целостности для двух таблиц, которые требуют, чтобы строки всегда были в обеих, было бы невозможно добавить строку в одну из них, не нарушая одно из ограничений, и вы не можете добавить строку в обе столы одновременно.