[英]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個表之一,不能同時鏈接兩個表。
一種可能的方法是將UserId
, RestaurantId
, TableId
, FoodId
等添加到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.