2010-04-05 105 views
2

所以我有一個有幾個表的數據庫。管理外鍵

第一個表包含用戶ID,姓氏和名字。

第二個表包含用戶ID,ID的興趣和利益的評價。

有具有所有利益的ID的另一個表。

對於每一個感興趣的ID(添加新的甚至當),我需要確保每個用戶都有爲該權益ID的條目(即使它的空白,或有默認值)。

外鍵是否有助於此場景?或者當我添加新密鑰時,是否需要使用PHP更新每條記錄?

回答

0

對於每一個感興趣的ID(添加新 者甚至當),我需要確保 每個用戶都有爲 興趣ID的條目(即使其空白,或者已經 默認值)。

這聽起來像你在查詢中的一個,而不是需要一個OUTER JOIN(無論是LEFTRIGHT)。

例如,如果你想獲得的感興趣程度的特定的人有每個利益:

假設你的表是這樣的:
用戶:
USER_ID PK
用戶

user_interests:
user_id PK FK
interest_id PK FK
interest_level

利益:
interest_id PK
興趣

SELECT i.interest, ui.interest_level 
FROM interests i 
INNER JOIN user_interests ui USING (interest_id) 
LEFT JOIN users u USING (user_id) 
WHERE user_id = ? 

?是一個佔位符。

請注意,ui.interest_level對於沒有數據的利益將爲空。

1

外鍵是一種約束,所以他們只能在失敗當您嘗試添加記錄。

您可以使用觸發器完成您所描述的內容。我不知道MySQL的語法,但在SQL Server會是這個樣子:

CREATE TRIGGER TR_ensure_user_interest ON interest FOR INSERT, UPDATE AS 
BEGIN 
    INSERT user_interest (user_id, interest_id) 
    SELECT user_id, interest_id 
     FROM inserted 
      ,user 
    EXCEPT (SELECT user_id, interest_id) 
END 

請注意,這是一個相當低效率的方法,但它應該包括很多你擔心的情況下。

更新:我同意其他誰在這裏觀察過設計「氣味」。如果您可以使用JOIN查詢完成所需的結果,那將是一個更有效的解決方案。但是,我試圖回答實際問到的問題。 (另外,我一直在這種情況下,在物理記錄是有幫助的其他數據庫用戶誰不擅長複合查詢。)

+0

感謝您花時間回答我的問題。這很好理解,但我認爲我實際上正在尋找與OMG Unicorns提供的內容相符的東西。我認爲觸發器最終會造成太多的開銷。 – jwzk 2010-04-05 16:29:42

0

這聽起來像你,迫使你的物理設計得太緊鏡像您的邏輯設計。

也許這將是爲什麼你需要插入一行在物理表中的每個用戶一個好主意,重新考慮究竟。如果給定用戶沒有關聯的興趣ID,那麼您是否可以只編寫查詢來假設興趣ID的默認值?

0

「外鍵是否有助於此場景?」

編號

您的約束是一種「完整性」約束。這意味着對於添加的每個新興趣,必須將有多少行添加到USER_INTEREST表中,因爲有用戶。

沒有SQL系統能夠爲您執行。您需要通過代碼來執行它。