簡體   English   中英

連接表聯接多個表

[英]Junction table joining multiple tables

我有一個帶有圖像的表格,需要鏈接到其他6個表格。 假設這些表格是-用戶,表格,食品,餐廳,類別和船只。

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

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

也許有第三種方法? 創建6個圖像表? 哪種解決方案是最佳的性能明智的選擇?

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

讓我重新表述一下問題:使用一對多關聯將Table與其他6個表中的僅一個連接的最佳方法是什么?

因此,“圖像”表應包含FK,並且只能鏈接到6個表之一,不能同時鏈接兩個表。

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

這樣,您可以為每個列添加適當的FK。 使用約束或觸發器(取決於DBMS),可以強制這些字段之一恰好not null FK約束處理該填充ID的實際驗證。

這樣一來,就可以輕松掌握所需的所有規則。

使用單獨的聯結表,這很難管理。 在為Table_Image插入聯結行時,必須驗證其他聯結表中是否沒有任何其他實體的此類記錄。

在描述你可以使用專屬FKS繼承 這個職位

如果您選擇前者,那么專用FK所采用的CHECK將需要使用稍有不同的語法(與鏈接中使用的語法)才是實用的:

在此處輸入圖片說明

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之一為非NULL。

順便說一句,您對“動態” FK(帶有“類型”字段)的懷疑是正確的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM