2010-02-25 89 views
3

我試圖實現類似於Ruby on Rails的多態關係。 我有以下三個表:SQL條件/案例連接/多態關聯?

活動 用戶 組織

事件可以由用戶或一個組織的所有者,所以我的活動表包含列:owner_type和owner_id。

我可以通過內部連接和where子句輕鬆列出屬於用戶或組織的所有事件,但是,有沒有辦法根據owner_type列的值使聯接表有條件,從而允許所有事件被列在一起,無論owner_type?

我希望這是有道理的。

任何意見讚賞。

謝謝。

回答

4

您不能使連接表有條件,所以在這種情況下,您必須將事件連接到用戶和組織,並使用合併將常用字段(例如,名稱)合併在一起。

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,姓名,...)的結構。這隻需要一次連接,但可能會使模式的其他方面複雜化,例如。用戶的組織成員資格。

另一種方法是將用戶和組織表合併在一起,然後再從事件中合併一次。

+0

+1,我在想什麼,如果需要的話,還可以將別名U和/或O的任何列添加到選擇列表中 – 2010-02-25 14:50:33

0

如何移動所有權信息出來Events分爲兩個連接表,EventsUsersEventsOrganisations(每個剛剛兩列,向FKS和Events的apppropriate擁有對象表)?然後你可以通過兩個查詢,每個查詢通過連接表連接到擁有對象表。

2

eventowner_model_01



  • Owner具有共同所有業主亞型列。
  • PersonOrganization具有特定於每個列的列。