@abberdeen

Полиморфизм в базе данных, как организовать таблицы?

Доброго дня,

Есть вопрос насчет проектирования связей таблиц. Существует сущность "Продавец", продавцом может быть либо "Организация", либо "Человек", вопрос в том что, как наладить связи между этими сущностями?
Необходимо чтобы между таблицами сущностей, были реальные связи, с ключами, без полей типов и. т. п.

Нельзя:
- Для сущностей "Организация" и "Человек", нельзя поставить поле "ИД Продавца", потому что они могут не быть продавцами,
- Для сущности "Продавец", нельзя просто поставить поля "ИД Организации" и/или "ИД Человека", так неправильно.

Я себе это представляю так:

5f30e29986614378592087.png
  • Вопрос задан
  • 251 просмотр
Решения вопроса 2
@d-stream
Готовые решения - не подаю, но...
Ну можно ориентироваться на contragent_type - который определит как минимум 3 сущности: организация (юрлицо), человек (физлицо) и ИП (физлицо с элементами организации), плюс с недавнего времени еще подветочка ИП - самозанятый. В таком ключе - seller - это всегда contragent, а вот в зависимости от contragent_type - в рамках контрагента - уже несколько пересекающихся сущностей. Притом организация - будет включать в себя как минимум кучку персон (директор, бухгалтер, контактные лица, ответственные, подписанты и т.п.). Притом в силу существующих реалий множественности компаний - одно и то же лицо может фигурировать и как фл и как контактная персона в нескольких компаниях и как директор-бухгалтер в еще нескольких...
Ответ написан
Maksclub
@Maksclub
maksfedorov.ru
Разделяйте ответственности
OrganisationSeller и PersonSeller могут наследоваться от Seller
и для реализации такого можно реализовать такой паттерн Single Table Inheritance

А вот обычные Organisation и Person связывайте с абстрактным Seller через обычную связь. Конкретные наследники будут лежать в зависимости от типа

Итого будет так:
(OrganisationSeller extends Seller) будет объектом Organisation.seller

Готовые решения:
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы