Условные SQL/объединение регистров/полиморфные ассоциации?
-
22-09-2019 - |
Вопрос
Я пытаюсь реализовать что-то похожее на полиморфные отношения Ruby on Rails.У меня есть следующие три таблицы:
События пользователи организации
Владельцем мероприятия может быть либо пользователь, либо организация, поэтому моя таблица «События» включает следующие столбцы:владелец_тип и владелец_ид.
Я могу легко перечислить все события, принадлежащие либо пользователям, либо организациям, с помощью внутреннего объединения и предложенияwhere, однако есть ли способ сделать таблицу соединений условной на основе значения столбца Owner_type, позволяя перечислять все события вместе, независимо от типа владельца?
Надеюсь это имеет смысл.
Любой совет ценится.
Спасибо.
Решение
Вы не можете сделать объединенную таблицу условной, поэтому в этом случае вам придется объединить события как для пользователей, так и для организаций, и использовать объединение для объединения общих полей (например.имя) вместе.
select e.id, coalesce(u.name, o.name) owner_name
from events e
left join users u on e.owner_id = u.id and e.owner_type = 'user'
left join organisations o on e.owner_id = o.id and e.owner_type = 'org'
Однако вы можете рассмотреть возможность создания таблицы владельцев, которая содержит как пользователей, так и организации, со структурой типа (id, type, org_id, name,...).Для этого потребуется только одно соединение, но это может усложнить другие области вашей схемы, например.членство пользователя в организации.
Альтернативным методом может быть объединение таблиц пользователей и организаций вместе, а затем объединение один раз по событиям.
Другие советы
Как насчет удаления информации о владельце из Events
на две объединяемые таблицы, EventsUsers
и EventsOrganisations
(каждый из которых имеет всего два столбца, от FK до Events
и соответствующую таблицу объектов-владельцев)?Тогда ты можешь UNION
два запроса, каждый из которых объединяется через таблицу соединений с таблицей объекта-владельца.