我正在尝试实现类似于 Ruby on Rails 的多态关系的东西。我有以下三个表:

活动用户组织

事件可以由用户或组织拥有,因此我的事件表包含以下列:所有者类型和所有者 ID。

我可以通过内部联接和 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,类型,org_id,姓名,...)的结构。这将只需要一个单一的加入,但可能会复杂化的模式,如其他领域。一个组织的用户的成员资格。

的另一种方法将是联合的用户和组织表在一起,然后从事件加入一次。

其他提示

eventowner_model_01



  • Owner 具有所有所有者子类型共有的列。
  • PersonOrganization 每一个都有特定的列。

如何移动所有权信息进行Events成两个连接表,EventsUsersEventsOrganisations(每一个均具有只是两列,FKS到Events和apppropriate拥有对象表)?然后,你可以UNION两个查询的每一个通过连接连接表所属对象表。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top