2014-09-21 88 views
0

我有一張帶有圖像的表格,需要鏈接到其他6個表格。假設這些表格是 - 用戶,表格,食物,餐館,類別和船舶。連接多個表格的連接表格

我應該創建6個不同的聯結表,以便每個表都有它自己的聯結表 - Images_Users,Images_Tables,Images_Restaurants等。

或者是更好地創建一個表與字段來區分它的鏈接 - Images_Entity與字段Id,Image_Id,Entity_Id,Entity_Type(我用它來區分它是一個用戶表,食物或其他) 。我不喜歡這個解決方案,因爲在這種情況下我將缺乏FK約束,但是我傾向於,因爲項目已經有大量的表。

也許還有第三種方法?創建6個圖像表?哪種解決方案是最好的性能?

編輯* 數據庫將用於顯示數據,插入,更新性能不是問題,只有選擇語句。我發現沒有圖像可以鏈接到兩個條目(這使得聯結表冗餘)。

讓我完全改述問題 - 使用一對多關聯將Table與其他6個表中的一個連接起來的最佳方式是什麼?

所以Images表應該包含FK,並且可以只鏈接到6個表中的一個,而不是兩個在同一時間。

+1

該解決方案基於如何使用數據。您沒有提供數據庫如何使用的指示,因此只有很少的信息才能給出明智的答案。 – 2014-09-21 18:06:23

+0

添加說明。 – 2014-09-21 18:34:35

+0

一對多在哪個方向?一家餐廳可以有多張圖片,或者一張圖片可以屬於多家餐館? – GolezTrol 2014-09-21 18:50:53

回答

1

this post描述你可以使用獨家FKS繼承

如果你選擇前者,獨家FKS採用的檢查將需要使用稍微不同的語法(從什麼是在鏈接中使用)是可行的:

enter image description here

CHECK (
    (
     CASE WHEN UserID   IS NULL THEN 0 ELSE 1 END 
     + CASE WHEN TableID  IS NULL THEN 0 ELSE 1 END 
     + CASE WHEN FoodID  IS NULL THEN 0 ELSE 1 END 
     + CASE WHEN RestaurantID IS NULL THEN 0 ELSE 1 END 
     + CASE WHEN CategoryID IS NULL THEN 0 ELSE 1 END 
     + CASE WHEN ShipID  IS NULL THEN 0 ELSE 1 END 
    ) 
    = 1 
) 

的上面的CHECK確保在任何給定時間只有一個FK是非空的。

順便說一句,你對「動態」FK(「類型」字段)的懷疑是correct

2

一種可能的方法是將UserIdRestaurantIdTableIdFoodId等添加到Images表。

這樣,您可以將適當的FK添加到每個這些列。 使用約束或觸發器(取決於DBMS),您可以強制確定其中一個字段爲not null。這個填充id的實際驗證由FK約束來處理。

通過這種方式,您可以很容易地在所有您想要的規則之前生效。

對於單獨的聯結表,這很難管理。當爲Table_Image插入聯結行時,您必須驗證其他聯結表中的任何其他實體是否不存在此類記錄。