Как обойти, требуя два внешних ключа, ссылающихся на одну таблицу - PullRequest
0 голосов
/ 13 февраля 2012

У меня есть таблица Person, в которую необходимо записать данные о прошлой и текущей профессии человека.У меня есть таблица занятий со списком имен и кодов занятий.Поскольку в таблице Person у меня не может быть current_occupation в качестве внешнего ключа, ссылающегося на Occupation, а также past_occuption в качестве внешнего ключа, ссылающегося на Occupation, как мне обойти это?Даже если я добавлю вторичную таблицу для записи отношений между Person и Occupation, у меня все еще будет та же проблема, что для каждого Person требуется два куска данных из Occupation.

Ответы [ 3 ]

1 голос
/ 13 февраля 2012

В таблице Person вы можете иметь current_occupation в качестве внешнего ключа, ссылающегося на Occupation, а также past_occuption в качестве внешнего ключа, ссылающегося на Occupation.В окне «Отношения» добавьте вторую копию таблицы «Занятия».Затем создайте линию связи от current_occupation до одной копии Occupation, а другую - от past_occuption до другой копии.

Однако этот подход ограничит вас только одним past_occuption для каждого человека.Если вы хотите записать несколько предыдущих профессий для каждого человека, предложенный Видором дизайн будет лучше.

1 голос
/ 14 февраля 2012
SELECT Person.PersonId, Person.Name, 
CurrentOccupation.OccupationName AS CurrentOcc, 
PreviousOccupation.OccupationName AS PrevOcc
FROM (Person INNER JOIN Occupation AS CurrentOccupation ON Person.CurrentOccId = CurrentOccupation.OccupationId) 
INNER JOIN Occupation AS PreviousOccupation ON Person.PreviousOccId = PreviousOccupation.OccupationId;

В этом коде дважды имеется таблица занятости в SQL, один раз с использованием внешнего ключа для currentOcc и один раз с использованием внешнего ключа для previousOcc, однако приведенное выше предложение по созданию новой таблицы с именем PersonOccupations является более гибким и надежным решением, посколькуэто позволяет любое количество занятий для человека.

0 голосов
/ 13 февраля 2012

Почему бы не иметь таблицу PersonOccupation с дополнительными полями для индексации их по «самым последним» или просто по дате, с которой они применяются. Затем выведите current и past_occupation из этого?

Тогда вам нужен только один внешний ключ, относящийся к OccupationId между PersonOccupation и Occupation.

...