Создание внешнего ключа для двух таблиц: employees_ce и employees_sn
Быстрый ответ
Чтобы указать на несколько разных таблиц, используйте полиморфные связи, добавив в дочернюю таблицу поля ref_id и type. Вот простой пример:
CREATE TABLE polymorphic_ref (
ref_id INT,
ref_type VARCHAR(100)
);
CREATE TABLE books (
book_id INT PRIMARY KEY
-- остальные поля
);
CREATE TABLE electronics (
electronics_id INT PRIMARY KEY
-- остальные поля
);
В таблице polymorphic_ref
столбец ref_id
может ссылаться на book_id
или electronics_id
, в то время как столбец ref_type
указывает, из какой именно таблицы происходит ссылка. Такой подход позволяет обойти стандартные ограничения SQL, и в этой ситуации бизнес-логика на уровне приложения играет ключевую роль в обеспечении целостности данных.
Создание унифицированной справочной таблицы
Если у вас имеются несколько таблиц с различными категориями сотрудников, например, employees
, employees_ce
, employees_sn
, рекомендуется создать унифицированную общую таблицу. Объединив их в одной таблице employees
с дополнительным столбцом type
, вы можете уменьшить количество таблиц и одновременно гарантировать ссылочную целостность — все внешние ключи будут ссылаться на один и тот же первичный ключ.
Обеспечение целостности данных с полиморфными внешними ключами
Если требуется указать внешний ключ на несколько таблиц, воспользуйтесь подходом с использованием псевдоключей. Создайте вспомогательную таблицу для этих целей — она позволит установить связь между различными сущностями. Данный подход облегчит выполнение таких операций, как DELETE CASCADE. Для определения подтипов используйте поле tinyint в качестве идентификатора таблицы в сочетании с уникальным индексом.
Настройка таблиц вычетов для ссылок на несколько таблиц
Если вам необходимо, чтобы таблица deductions
ссылались на различные подтипы сотрудников, используйте одно поле внешнего ключа, которое указывает на объединенную таблицу employees
. Это может упростить структуру вашей таблицы. Включите также идентификационное поле для трассировки происхождения каждой записи.
Визуализация
Давайте визуализируем концепцию внешнего ключа, который ссылается на первичные ключи разных таблиц, через аналогию с космической станцией🛰️:
Модуль космической станции (🛰️) | Соответствующий порт (🔗) |
---|---|
Научный модуль (🧪🧬) | Порт A (🔑1) |
Жилая зона (🛌🏠) | Порт B (🔑2) |
Склад запасов (📦🔩) | Порт C (🔑3) |
Универсальный адаптер (🛠️) выполняет роль внешнего ключа:
Универсальный адаптер (🛠️) |
---|
Может соединяться со всеми: Порт A (🔑1), |
Порт B (🔑2) и Порт C (🔑3) |
Главная идея: Также как адаптер может подключаться к различным портам, внешний ключ может связываться с первичными ключами нескольких таблиц.
Управление сложными связями в базе данных
Объединенная или отдельная архитектура?
Убедитесь, что вам действительно нужны отдельные таблицы для подтипов. Иногда единая таблица с колонкой типизации может упростить архитектуру базы данных и сократить избыточность.
Добавление идентификационного поля
В единой архитектуре дополните все связанные таблицы идентификационным полем для наглядного отслеживания подтипов.
Активное обеспечение целостности данных
Если внешние ключи указывают на разные таблицы, обязательно внедрите механизмы для ручного обеспечения целостности данных в прикладной логике, включая проверку наличия родительской записи и соответствующее управление обновлением и удаляемых данных.
Специализированная таблица для связей
В сложных ситуациях, когда прямое использование внешних ключей для нескольких таблиц невозможно, создайте специализированную таблицу связей. Это поможет поддерживать целостность данных, обычно обеспечиваемую стандартными механизмами внешних ключей в СУБД.
Полезные материалы
- Готовые примеры моделей баз данных – Database Administrators StackExchange — Обсуждение на Stack Exchange о применении полиморфных внешних ключей в разных таблицах.
- PostgreSQL: Документация: 16: 5.4. Ограничения — Официальная документация PostgreSQL на использование внешних ключей.
- Vertabelo Database Modeler — Статья об об управлении полиморфными связями в реляционных базах данных.
- Database Links — Описание Oracle подхода к установлении связей в реляционных базах данных с использованием нескольких внешних ключей.
- Eloquent: Relationships – Laravel 8.x – Фреймворк PHP для веб-мастеров — Информация об использовании полиморфных связей в ORM Eloquent Laravel.