2013-07-18 74 views
0

我有以下表格:處理數據庫跨外鍵

USER表:

id | username | password | join_date | avatar_image_id 

圖像表:

id | url | user_owner_id 

圖像表保存的帖子,文章和用戶頭像的所有圖片。每張圖片都屬於可編輯它的用戶。所以user_owner_id是必要的,但僅僅知道哪個圖像是用戶的頭像是不夠的,所以我需要avatar_image_id

這個交叉外鍵出問題了嗎?這是一個糟糕的設計?有什麼辦法解決它?

回答

0

這裏有幾個選項。

選項1

您在圖片表中做到這一點: -

id 
url 
user_owner_id 
user_avatar_id 
  • user_avatar_id列是一個外鍵到用戶表
  • user_avatar_id允許空值,表示圖像不是任何人的頭像
  • 由於每個用戶只有一個頭像,user_avatar_id應該是唯一的

這樣做的好處是您可以繼續在代碼中只處理前三列的所有圖像。只有當您具有用於頭像圖片的特定代碼時,您才需要考慮最後一列。

這有效地實施了「每個用戶都有0個或1個化身」的規則。也許當用戶第一次創建時,他們還沒有頭像,所以這是好的?如果每個用戶都嚴格必須有一個形象,你想在你需要選擇數據庫執行這項2.

選項2

如何必要的是,所有的圖像在同一表中去?你是否經常用同一段代碼來處理頭像圖片和其他圖片?如果沒有,你可以考慮增加以下列到用戶表: -

avatar_url 

這將使得它快速,輕鬆地找到相應的頭像圖片給定用戶。但是,它可能會使圖像編輯代碼複雜化,因爲現在您必須考慮存儲在image表中的東西以及這些特殊的頭像圖像。

總的來說,我可能會選擇選項1.

0

一般來說是的Cross Foreign Keys是一個痛苦的,特別是如果你想刪除(或存檔)。這是因爲你不能刪除任何行。

來處理這方面的一個辦法就是定義FOREIGN KEYNOCHECK約束到avatar_image_id

另一種方式是增加一個BIT列於表IMAGEIsAvatarImage。使用正確的索引,這種方法對性能的影響應該很小。

+0

如何將'user_owner_id'從外鍵更改爲普通行?我不需要這麼搜索。通常的連接是從用戶表到圖像,而不是相反。 – sheno

+0

@sheno。你的問題是關於'設計':-)。 'user_owner_id'是'FOREIGN KEY'更強的。在概念數據庫設計中搜索是不同的事情。 –

+0

只是爲了澄清,當我寫更強的時候,我的意思是'user_owner_id'無論如何都不能被替換,而'avatar_image_id'可以替換成我用'IMAGE.IsAvatarImage''BIT'寫的 –