Два внешних ключа, ссылающихся на один и тот же первичный ключ
Можно ли иметь два внешних ключа в одной таблице, ссылающихся на один первичный ключ другой таблицы?
EmployeeID является первичным ключом в таблице employee и дважды отображается в таблице поиска в таблице расписания.
Будет немного пользователей-пользователей, заполняющих листы от имени других сотрудников.
В поле таблицы темных таблиц "TimsheetFor" будет иметь employeeID этого человека, который работал над проектами, а поле "EnteredBy" или "FilledBy" будет иметь employeeid того человека, который заполнил этот расписание.
Какая из следующих параметров верна?
ПРИМЕЧАНИЕ. В таблицах показаны только те поля, которые связаны с этим вопросом.
![enter image description here]()
Ответы
Ответ 1
Я бы пошел с опцией 1. Совершенно хорошо иметь два столбца внешнего ключа, ссылающиеся на один и тот же столбец первичного ключа в другой таблице, поскольку каждое значение внешнего ключа будет ссылаться на другую запись в связанной таблице.
Я уверен, что вариант 2 будет работать, но вы по существу должны иметь отношения 1 к 1 между TIMESHEET_TABLE
и TIMESHEET_FILLED_BY
, что делает две таблицы ненужными и более трудными для поддержания.
Фактически, если оба параметра ENTERED_BY
и TIMESHEET_FOR
требуются в парах, использование опции 1 имеет гораздо больший смысл, поскольку это автоматически принудительно используется базой данных и внешними ключами.
Ответ 2
да, нет проблем с этим... вы можете использовать первичный ключ одной таблицы в другой таблице как внешний ключ два раза.
Ответ 3
Вариант 1 - идеальное решение. Вы можете определить ограничение внешнего ключа следующим образом
Первое ограничение внешнего ключа для столбца Timesheet_For
ALTER TABLE TIMESHEETTABLE
ADD CONSTRAINT fk_TimesheetTable_EmployeeTable
FOREIGN KEY (TIMESHEET_FOR)
REFERENCES EMPLOYEETABLE(EMPLOYEE_ID)
Ограничение второго внешнего ключа для столбца Entered_By
ALTER TABLE TIMESHEETTABLE
ADD CONSTRAINT fk_TimesheetTable_EmployeeTable_1
FOREIGN KEY (ENTERED_BY)
REFERENCES EMPLOYEETABLE(EMPLOYEE_ID)