Условные SQL/объединение регистров/полиморфные ассоциации?

StackOverflow https://stackoverflow.com/questions/2333501

  •  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,...).Для этого потребуется только одно соединение, но это может усложнить другие области вашей схемы, например.членство пользователя в организации.

Альтернативным методом может быть объединение таблиц пользователей и организаций вместе, а затем объединение один раз по событиям.

Другие советы

eventowner_model_01



  • Owner имеет столбцы, общие для всех подтипов владельцев.
  • Person и Organization иметь столбцы, специфичные для каждого из них.

Как насчет удаления информации о владельце из Events на две объединяемые таблицы, EventsUsers и EventsOrganisations (каждый из которых имеет всего два столбца, от FK до Events и соответствующую таблицу объектов-владельцев)?Тогда ты можешь UNION два запроса, каждый из которых объединяется через таблицу соединений с таблицей объекта-владельца.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top