2015-10-17 63 views
1

下面是一個例子架構來說明什麼我談論:如何擺脫「間接」外鍵?我是不是該?

sample database schema

比方說,我存儲的一些活動的信息(講座,培訓,等等)是在一組特定的被託管根據類型(黑客空間,游泳池等)和城市確定的位置。每個活動都在合適類型的所有位置立即發生(例如,任何編程研討會一次在所有黑客空間發生),因此任何人都可以選擇在任何合適的位置參加活動。因此,任何活動只與某個位置類型相關聯,而考勤記錄與某個活動(因此隱含在某種位置類型中)以及該特定用戶參加該活動的城市相關聯。

到目前爲止,系統中最常見的查詢是生成一個給定人蔘與的所有活動的報告。

我覺得這很難看嗎?我應該嘗試重新設計這個,如果是這樣,怎麼樣?

P.S.我寧願不透露我存儲在數據庫中的實際數據,因爲我不得不採用類似的設計,所以我希望這種類比是有道理的。

+0

位置缺少主鍵。 (其餘部分自然而然) – wildplasser

+0

@wildplasser這對(Type,City)是Locations的主鍵。 –

+0

如果某個地點有多種類型,該怎麼辦? (黑客空間+游泳池+檯球) – wildplasser

回答

1

這聽起來像你需要一個LocationTypes表與位置類型列表。然後,Location可以與LocationTypes有外鍵關係。

但是,我不喜歡假設這組位置不隨時間變化。所以這太簡單了。所以,我會有另一個類似LocationSets的實體,它會列出一段時間內給定活動的位置。 LocationSets將包含可以使用的「類型」。與位置集相關聯的位置將位於另一個表中,即連接位置集和位置的交接表。

然後Activities將有LocationSetId。而Attendance將有一個LocationId。您可能希望在任何時候執行該操作,Attendance的位置與ActivityLocationSets中的位置一致。這可以在應用程序層完成,通過數據庫中的觸發器,或通過基於函數的約束(如果數據庫支持這些約束)等機制完成。

+0

*嘆*看起來我的比喻崩潰了(儘管這完全是我的錯)。 在我的情況下,位置和活動都不會改變,並且對於每個LocationType,只存在幾個位置。此外,具有相同LocationType的多個位置之間的差異非常小。 –