Необходимо ли, чтобы внешний ключ некоторой таблицы был ключом-кандидатом той же таблицы? - PullRequest
0 голосов
/ 07 июля 2011

Внешний ключ обязательно должен быть ключом-кандидатом для таблицы (скажем, table1)?Я знаю, что внешний ключ ссылается на первичный ключ какой-то другой таблицы (скажем, table2).Но для таблицы1 нужно ли, чтобы это был ключ-кандидат?

Ответы [ 2 ]

4 голосов
/ 07 июля 2011

По определению внешний ключ необходим для ссылки на ключ-кандидат в целевой таблице (таблица2 в вашем вопросе).Внешний ключ не обязательно должен быть ключом-кандидатом в таблице , ссылающейся на , или быть частью ключа-кандидата в этой таблице.

2 голосов
/ 07 июля 2011

Нет. Вы можете иметь отношение 1: N, требование FK просто говорит, что поле должно существовать в другой таблице. Является ли это поле уникальным или нет, не имеет значения.

Для справки:

  • ключ-кандидат является альтернативой PK, это может быть одно поле или комбинация полей (как в сцепленном ключе)

    1. все, что это устанавливает, состоит в том, что существует несколько способов однозначно идентифицировать запись таблицы
    2. хорошей альтернативой employee_id может быть ssn (номер социального страхования)

  • объединенный ключ - это несколько полей, которые составляют уникальность записи, которая может быть альтернативой PK или вместе выступать в роли PK

    1. , поскольку СУБД следуют как минимум за 1NF, все поля таблицы могут использоваться в качестве связанного ключа
      Примечание: это плохой выбор и служит только примером

    2. воспринимайте поле employee_id как один PK таблицы, но комбинация firstname, lastname и startdate, вероятно, будет однозначно идентифицировать всех на вашем столе сотрудников
      Примечание: это пример, на практике, вероятно, будут лучшие альтернативы этому

...