2017-09-22 86 views
0

我正在爲我正在開發的一個新項目構建數據模型。這個數據模型的一部分涉及具有「標誌」的實體。數據庫理論:有一個可應用於許多實體的「標誌」表的最佳方式?

一個標誌只是一個布爾值 - 實體有標誌或沒有標誌。爲此,我有一個名爲「標誌」的表,它具有一個ID,一個字符串名稱和一個描述。 (標誌示例可能是「正在激活」或「應該顯示」或「屬於組」)

因此,例如,我的用戶表中的任何用戶都可能沒有任何用戶,一個或多個標誌。所以我創建了一個帶有用戶ID和標誌ID的userFlags橋接表。如果表中包含給定標誌ID和用戶ID的行,則該用戶具有該標誌。

好的,現在我添加另一個實體 - 說「部分」。每個部分也可以有標誌。所以我創建了一個sectionFlags表來適應這個。

現在我有另一個實體 - 「內容」,所以再次,「contentFlags」。

依此類推。

我的最終數據模型每個實體基本上有兩個表,一個用於保存實體,另一個用於保存標誌。

雖然這當然工程,似乎有可能有更好的方式來設計我的模型,所以我不必有這麼多的橋表。我有一個想法是一個主標記「hasFlags」表與標誌ID,項目ID和項目類型。項目類型可以是隻接受與已知實體相對應的值的枚舉字段。唯一的問題是,我的實體的外鍵不起作用,因爲每個「項目ID」可能引用不同的實體。 (我已經在其他數據模型中實際使用了這種技術,雖然它確實有效,但您會失去參考完整性以及諸如級聯更新之類的事情。)

或者,或許我的數據模型是原樣的,而這只是野獸的性質。

任何更高級的經驗豐富的數據庫開發人員都會關心嗎?

回答

1

多對多關係是實現它的一種方法(並且可能比我要建議的更快,因爲它們可以使用整數鍵索引)。

另一種做法是使用多態關係。

您的實體到標誌表需要2列以及到標誌表的外鍵鏈接;

other_key integer not null 
other_type varchar(...) not null 

而在這些領域,你存儲在整數的關係,並在VARCHAR關係的類型的外鍵。支持這種功能的全功能ORM有時會將外部關係的類名稱存儲在類型列中,以幫助進行對象加載。

這裏的缺點是整數不能是真正的外鍵,因爲它將包含許多表中的重複項。它也使得您的查詢比多對多表更加有趣地實現每個連接,但它確實允許您在代碼中推廣連接。

相關問題