Полиморфная связь в СУБД. Что это? В каких случаях использовать?

Forums:

Полиморфные связи используются в СУБД, когда требуется установить связь между основной таблицей, и ... некой второй таблицей (а какой, - будет известно только после запуска скрипта:))

Другими словами, это классический пример связи Один-к-одному по внешнему ключу, в котором одна из таблиц определяется динамически. Вот этот пример:

Обычная связь

Есть менеджер, который может оформить возврат товара.

+--------------+
| rejection    |
| manager      |
+--------------+

rejection:

+------+------------+------------+
| id   | date       | manager_id |
+------+------------+------------+
|  1   | 2018-08-28 |       1    |
|  2   | 2018-08-28 |       1    |
+------+------------+------------+

manager:

+----+--------+
| id |  name  |
+----+--------+
|  1 |  Вася  |
+----+--------+

НО! Ещё одна личность, которая имеет право осуществить возврат - кассир!

Так вот. Теперь внешний ключ использовать не удастся, т.к. у нас 2 таблицы, с которыми может быть установлена связь.

Конечно, можно добавить в таблицу rejection поле cashier_id. Но тут у нас появится director, который захочет авторитарным произволом всегда иметь возможность сделать возврат, directorWife (без комментариев), guard на случай, если срочно надо, cleaningWoman потому что без неё ничего не обходится, и т.д. И для них всех придётся создавать поля и внешние ключи.

Итак, чтобы избежать лишнего размножения полей с внешними id, и придумана полиморфная связь.

Полиморфная связь

Добавляем к таблице rejection поле entity_type. Вуаля, теперь id всех таблиц можно хранить в одном поле, а на таблицу, где искать укажет поле "тип сущности":

rejection:

+------+------------+--------------+----------------+
| id   | date       | operator_id  | operator_type  |
+------+------------+--------------+----------------+
|  1   | 2018-08-28 |        1     |     manager    |
|  2   | 2018-08-28 |        1     |     cashier    |
+------+------------+--------------+----------------+

Источник

vedro-compota's picture

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

_____________
матфак вгу и остальная классика =)