2011-04-08 79 views
3

對現有應用程序有一項新要求。目前,我們有一個組織表,它有一個子表CalendarEvents。現在,請求將允許用戶表,組織表或分區表自己的日曆事件。我在想有什麼需要,因爲現在發生變化,這會離開我與創建如下表結構:試圖避免多個父表

  • 組織(的organization_ID)
  • 用戶(USER_ID,的organization_ID)
  • 司(division_id),
  • 日曆(CALENDAR_ID,的organization_ID,USER_ID,division_id),
  • CalendarEvents(calendar_event_id,CALENDAR_ID)

我試圖避免將日曆鏈接到多個父母。有沒有更好的方法來做到這一點,我失蹤了? (組織/用戶/部門可以有多個日曆,但只有一個組織/用戶/部門可以擁有日曆)

感謝您的任何輸入。

+0

用戶,部門和組織之間的關係是什麼? – 2011-04-09 01:46:56

+0

組織對用戶是1對多。部門還沒有實施,但這些組織可能會有1到多個,可能有1到很多有用戶,但可能多到很多。 – Ryan 2011-04-11 15:22:51

回答

2

由於用戶實例和組織情況下可以有自己的事件,我會傾向於做獨立的表:

Organization 
OrganizationCalendarEvents (with FK to Organization) 
User 
UserCalendarEvents (with FK to User) 

這樣,這兩個實體可以控制自己的事件。另外,如果你保持結構相同,你可以在你的中間層中使用一個基類,它可以從任何一個表中加載。

1

是的。有一種叫做「變形」的技巧,適合你的情況。您的CalendarEvents表應該有一個名爲「owner_type」的字段和另一個名爲「owner_id」的字段。 「owner_type」將指示「owner_id」是特定行的外鍵的表。如果owner_type是1,那麼owner_id是一個user_id;如果owner_type是2,那麼owner_id是organization_id。等等。

+2

任何消費者曾經寫過的每個查詢都會尊重owner_type列的機率是多少?您無法加入此處,因此您要麼在代碼中編寫三個查詢並進行分支,要麼每次執行兩個查詢。不用了,謝謝。 – 2011-04-08 22:57:17

+0

我也在考慮走這條路線,這本來就是我最初的解決方案的一個更清晰的版本。它仍然讓我不得不在查詢中寫入比想要的更多的邏輯。不過謝謝。 – Ryan 2011-04-11 15:20:42

2

如果每個實體(用戶,組織和分部)的CalendarEvents是互斥的,我可能會從三個相同的事件表開始:UserCalendarEvents,OrganizationCalendarEvents和DivisionCalendarEvents。

更好的解決方案,不過,可以是定義的那些的鏈接三個表:

UserCalendarEvents 
    user_id 
    calendar_event_id 

OrganizationCalendarEvents 
    organization_id 
    calendar_event_id 

DivisionCalendarEvents 
    division_id 
    calendar_event_id 
1

One table column for many fk tables?

and

multiple tables need one to many relationship

如果您希望DBMS強制執行任何日曆事件總是針對X,Y或Z(以及其中一個)的完整性規則,那麼您必須創建三個表。

您可以通過將它們聯合在一起創建「所有日曆事件」視圖(當然,在投影掉所有者列之後)。顯然,這個觀點是不可更新的。

如果您設置了三個單獨的表格,並且只有「共享」事件表的「鏈接」,您仍然不會因「孤立」事件而被警惕。