2010-02-05 70 views
4

假設你有以下的許多一對多表關係:許多一對多數據庫設計問題

user 
----- 
id 
first_name 
last_name 

user_prefs 
---------------- 
id 
preference_name 

user2user_prefs 
------------- 
id 
user_id 
user_pref_id 

但是說你有「主頁」的用戶偏好和需要的地方來存儲實際的主頁網址。那去哪裏?

我不能在user_prefs中放置一個值,因爲那樣的話這個值就會適用於每個有這種映射的人。

我可以把它放在user2user_prefs像這樣:

user2user_prefs 
------------- 
id 
user_id 
user_pref_id 
value 

但是,這是在標準化方面的最佳方法是什麼?對於我這樣做的方式,有些事情感覺不太正確(一方面,我不能在新的「值」上使用ENUM,因爲它必須包含所有首選項的所有值)。有什麼想法嗎?

謝謝! Stabby L

回答

3

你必須看看函數的依賴關係。該值不取決於用戶,它不取決於userpref,但它依賴於兩者。這意味着您需要按照您的建議將其放置在user2user_prefs表格中。

如果您需要使用枚舉,那麼value屬性可以查找另一個表中的值。

+0

這就是答案我心裏暗自希望...感謝;-) – 2010-02-09 16:17:07

1

我不能放的user_prefs 值,因爲那麼相同的值會 適用於每一個人誰擁有 映射。

你正常化太過分了。首頁在user_prefs中會很好。

事實上,如果我是你,我只使用一個表:

user 
----- 
id 
first_name 
last_name 
homepage 
<other settings> 

外鍵關係,特別是許多一對多的關係,在複雜性很大的成本。軟件開發人員的工作是保持複雜性得到控制。

+0

你還會說,如果網頁上只有三十不同的用戶喜好嗎?那張桌子非常大而且平坦 – 2010-02-05 23:43:41

+0

大胖子桌子沒什麼問題。問題是,多對多關係是什麼增加的?爲了幫助您平衡它,請編寫兩個使用兩種設計的簡單客戶端。我想你會發現處理多對多關係的經驗:) – Andomar 2010-02-06 00:21:22

+0

我一直在尋找的多對多設計的好處是能夠控制和查看所有不同的用戶偏好一個表(user_prefs)。我喜歡在一個地方定義這些選項,出於同樣的原因,我會使用ENUM而不是VARCHAR作爲預定義的值。在我看來,它使代碼維護更簡單一些。在我的原始文章中,您將能夠查詢user_pref以查看所有用戶可以使用的所有選項。我意識到把它放在用戶表中會達到同樣的效果,這就是爲什麼我會問正常化的原因... – 2010-02-06 00:37:04

1

在我看來,特定類型的值實際上並不屬於多關係。如果某個特定的屬性值是特定於每個用戶的,那麼它應該是一個單獨的表。它「感覺」像從user到另一個具有每個用戶特有的首選項的表之間存在一對多關係。

編輯:對於1對多表:

user_specific_prefs 
------ 
id 
user_id 
pref_name (or possibly pref_id that indicates the type) 
pref_value (store www.myhome.com for example) 

user_ID的只是外鍵返回到特定的用戶。這基本上(從邏輯意義上說)向用戶表中添加額外的列。但是正如Andomar指出的那樣,它確實增加了複雜性。但如果你有這樣的喜好數量龐大,它可能是好的。另一方面,我看過有數百列的表格。我並不是說這很好(我沒有創建它們),但他們完成了這項工作,並且易於使用。

+0

這很有趣,但我不知道我是否掌握了你的說法。任何希望你可以畫出桌子? – 2010-02-05 23:49:01

+0

感謝您的編輯。這更接近我的原始設置 – 2010-02-06 02:47:32

0

你非常接近。

[編輯:我以前認爲是輝煌的答案並不那麼輝煌。]

編輯表:

users 
----- 
id 
first_name 
last_name 
preferences 

偏好字段將舉行的特定用戶的選項序列化對象或數組。 在PHP:

if (is_array($options) || is_object($options)) 
     serialize($options); 

Serialize Manual

+0

使用這樣的首選項表將創建一個名稱/值對,這對每個用戶都是相同的,這是我原始問題的一部分 – 2010-02-06 00:26:14

+0

您是對的。顏色:紅色,顏色:藍色,顏色:orage。嗯 – 2010-02-06 01:15:42