У меня есть две таблицы, а именно employee_ce и employee_sn под сотрудниками базы данных.
У них обоих есть соответствующие уникальные столбцы первичного ключа.
У меня есть еще одна таблица, называемая вычетами, столбец внешнего ключа которой я хочу сослаться на первичные ключи employee_ce, а также employee_sn. Это возможно?
например
employees_ce
--------------
empid name
khce1 prince
employees_sn
----------------
empid name
khsn1 princess
так возможно ли это?
deductions
--------------
id name
khce1 gold
khsn1 silver
Вы, вероятно, можете добавить два ограничения внешнего ключа (честно: я никогда не пробовал), но тогда он будет настаивать на существовании родительской строки в обеих таблицах.
Вместо этого вы, вероятно, захотите создать супертип для двух подтипов ваших сотрудников, а затем вместо этого указать внешний ключ. (Конечно, при условии, что у вас есть веская причина разделить сотрудников на два типа).
type
в таблице сотрудников будетce
илиsn
.источник
LEFT JOIN
все, если их мало. Если не используется базовая таблица «employee», первичный ключ не может быть объявлен (потому что он ссылается на tableA, tableB или…); теперь это возможно. Мудрость расщепленияemployees_ce
иemployees_sn
была принята, и это предположение отмечено.Собственно и сам делаю. У меня есть таблица под названием «Комментарии», которая содержит комментарии к записям в трех других таблицах. Ни одно из решений на самом деле не справляется со всем, что вам, вероятно, нужно. В вашем случае вы бы сделали это:
Решение 1:
Добавьте поле tinyint в employee_ce и employee_sn со значением по умолчанию, которое отличается в каждой таблице (это поле представляет собой «идентификатор таблицы», поэтому мы назовем их tid_ce и tid_sn)
Создайте уникальный индекс для каждой таблицы, используя PK таблицы и поле идентификатора таблицы.
Добавьте поле tinyint в таблицу «Вычеты» для хранения второй половины внешнего ключа (идентификатор таблицы).
Создайте 2 внешних ключа в своей таблице «Вычеты» (вы не можете обеспечить ссылочную целостность, потому что либо один ключ будет действительным, либо другой ... но никогда оба:
ALTER TABLE [dbo].[Deductions] WITH NOCHECK ADD CONSTRAINT [FK_Deductions_employees_ce] FOREIGN KEY([id], [fk_tid]) REFERENCES [dbo].[employees_ce] ([empid], [tid]) NOT FOR REPLICATION GO ALTER TABLE [dbo].[Deductions] NOCHECK CONSTRAINT [FK_600_WorkComments_employees_ce] GO ALTER TABLE [dbo].[Deductions] WITH NOCHECK ADD CONSTRAINT [FK_Deductions_employees_sn] FOREIGN KEY([id], [fk_tid]) REFERENCES [dbo].[employees_sn] ([empid], [tid]) NOT FOR REPLICATION GO ALTER TABLE [dbo].[Deductions] NOCHECK CONSTRAINT [FK_600_WorkComments_employees_sn] GO employees_ce -------------- empid name tid khce1 prince 1 employees_sn ---------------- empid name tid khsn1 princess 2 deductions ---------------------- id tid name khce1 1 gold khsn1 2 silver ** id + tid creates a unique index **
Решение 2. Это решение позволяет поддерживать ссылочную целостность: 1. Создайте второе поле внешнего ключа в таблице «Вычеты», разрешите нулевые значения в обоих внешних ключах и создайте обычные внешние ключи:
employees_ce -------------- empid name khce1 prince employees_sn ---------------- empid name khsn1 princess deductions ---------------------- idce idsn name khce1 *NULL* gold *NULL* khsn1 silver
Целостность проверяется только в том случае, если столбец не равен нулю, поэтому вы можете поддерживать ссылочную целостность.
источник
Я знаю, что это давно застойная тема, но, если кто-то ищет, вот как я справляюсь с внешними ключами с несколькими таблицами. При использовании этого метода у вас нет каких-либо принудительных каскадных операций DBA, поэтому убедитесь, что вы имеете дело с
DELETE
и подобными в своем коде.Пример SO Op будет выглядеть так
deductions -------------- type id name 1 khce1 gold 2 khsn1 silver types --------------------- 1 employees_ce 2 employees_sn
источник
Технически возможно. Вы, вероятно, будете ссылаться на employee_ce в вычетах и employee_sn. Но почему бы вам не объединить employee_sn и employee_ce? Я не вижу причин, почему у вас два стола. Отношения «никто ко многим». И (не в этом примере) много столбцов.
Если вы делаете две ссылки для одного столбца, у сотрудника должна быть запись в обеих таблицах.
источник
Да, это возможно. Вам нужно будет определить 2 FK для 3-й таблицы. Каждый FK указывает на обязательное поле (поля) одной таблицы (т. Е. 1 FK на внешнюю таблицу).
источник
Предполагая, что по какой-то причине у вас должны быть две таблицы для двух типов сотрудников, я расширю ответ vmarquez:
Схема:
Данные в отчислениях:
Это позволит вам использовать вычеты для любой другой таблицы в вашей схеме. Этот вид отношений не поддерживается ограничениями уровня базы данных, IIRC, поэтому вам нужно убедиться, что ваше приложение правильно управляет ограничением (что делает его более громоздким, если у вас есть несколько разных приложений / служб, обращающихся к одной и той же базе данных).
источник