Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Проектирование БД Новый топик    Ответить
 Как связать различные сущности с одним полем?  [new]
Victor Mog
Member

Откуда:
Сообщений: 32
Есть таблица, описывающая системы (system, например).
А у систем есть владелец - сотрудник, подразделение или организация.
Как мне это связать в БД?!
11 сен 17, 09:42    [20785740]     Ответить | Цитировать Сообщить модератору
 Re: Как связать различные сущности с одним полем?  [new]
netfrog
Member

Откуда:
Сообщений: 666
Victor Mog,

Как это сделано в операционных системах:

Сделай группу доступа, в неё включи тех, кто имеет права.

К защищаемой системе присоединить один к одному группу доступа и, возможно, поле владельца системы.
11 сен 17, 09:51    [20785774]     Ответить | Цитировать Сообщить модератору
 Re: Как связать различные сущности с одним полем?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 43650

Victor Mog
Как мне это связать в БД?!

Используй foreign key между таблицами system и owner, Люк!

Posted via ActualForum NNTP Server 1.5

11 сен 17, 11:18    [20786056]     Ответить | Цитировать Сообщить модератору
 Re: Как связать различные сущности с одним полем?  [new]
Victor Mog
Member

Откуда:
Сообщений: 32
Может я не смог объяснить подробно...
Нет таблицы owner!
Есть employees/i], [i]organisatrions и divisions - разные сущности!
11 сен 17, 11:34    [20786130]     Ответить | Цитировать Сообщить модератору
 Re: Как связать различные сущности с одним полем?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 43650

Victor Mog
Нет таблицы owner!

Так создай. И перенеси туда общие поля из трёх перечисленных.

Posted via ActualForum NNTP Server 1.5

11 сен 17, 12:02    [20786219]     Ответить | Цитировать Сообщить модератору
 Re: Как связать различные сущности с одним полем?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 15944
Victor Mog
у систем есть владелец - сотрудник, подразделение или организация.
Иными словами, экземпляр сущности "контрагент" является атрибутом сущности "система". В этом случае - просто поле в таблице систем и FK в таблицу с деревом контрагентов.
Либо экземпляр сущности "контрагент" является мульти-атрибутом сущности "система" (несколько экземпляров контрагента одновременно являются владельцем экземпляра системы). В таком случае дополнительная связывающая таблица СистемаКонтрагент, и FK из неё в обе таблицы.
11 сен 17, 12:44    [20786397]     Ответить | Цитировать Сообщить модератору
 Re: Как связать различные сущности с одним полем?  [new]
registerers
Member

Откуда:
Сообщений: 47
Victor Mog,

как то так?

Картинка с другого сайта.
11 сен 17, 18:28    [20787975]     Ответить | Цитировать Сообщить модератору
 Re: Как связать различные сущности с одним полем?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 15944
registerers
как то так?
Нет, как-то не так. Организация, Отдел, Сотрудник - в рамках предметной области это одна и та же сущность Владелец. И таблица должна быть одна, а не три.
12 сен 17, 08:37    [20788772]     Ответить | Цитировать Сообщить модератору
 Re: Как связать различные сущности с одним полем?  [new]
Владимир П.
Member

Откуда: Екатеринбург
Сообщений: 420
Akina
это одна и та же сущность Владелец. И таблица должна быть одна, а не три.

Ты предлагаешь создать таблицу OWNER. А как ты бы поступал дальше?

Вариант с полем-дискриминантом и IDом без внешнего ключа (OwnershipType + OwnerId) уже многократно (и справедливо) раскритикован именно за то, что не позволяет создать внешний ключ и добится декларативного контроля целостности ссылок. Его рассматривать не будем.

Можно сделать в таблице OWNER по внешнему ключу на каждый тип владельца. Это позволит легко создать ограничение "тип владельца должен быть один и только один" (подсчитать количество NOT NULL'ов и потребовать, чтобы оно было равно 1). Но потребует вмешаться в структуру таблицы всякий раз, когда набор возможных типов владельцев изменяется.

Второй вариант — сделать ссылки в противоположном направлении, от владельцев каждого конкретного типа к общей таблице OWNER. Но проконтролировать, чтобы на каждую запись OWNER была ровно одна ссылка — наверное, здесь придётся накручивать нетривиальную логику на триггерах или хранимках.
15 сен 17, 15:14    [20799150]     Ответить | Цитировать Сообщить модератору
 Re: Как связать различные сущности с одним полем?  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 33438
Victor Mog
Есть таблица, описывающая системы (system, например).
А у систем есть владелец - сотрудник, подразделение или организация.
Как мне это связать в БД?!


Наследование и связь с общим предком.
15 сен 17, 16:22    [20799409]     Ответить | Цитировать Сообщить модератору
Все форумы / Проектирование БД Ответить