2010-05-05 40 views
1

我正在創建一個會員網站,目前我正在處理用戶首選項設置。我應該創建一個包含所有首選項字段(大約17個字段)的表,還是應該將它們與帳戶設置一起包含在主成員表中?用戶偏好應該包含在用戶表中嗎?

對於表中應該有多少個字段有限制嗎?目前成員表有大約21個字段......不知道是否可以再添加另外17個字段,我可以輕鬆地將它們放在另一個表中。需要更多的代碼來提取數據,儘管......任何建議?

回答

3

我會分開他們的可維護性。一個查詢可以將它們全部取出。並且差異應該可以忽略

+0

約定...對普通「關鍵」的簡單連接應始終爲1:1的比例,但偏好的要素可以增長而不會混淆其他要素。 – DRapp 2010-05-05 17:48:38

0

這取決於。

對於一個小型站點,將所有內容干擾到一個表中可能需要較少的編碼(不需要聯接)。而且,由於用戶偏好似乎與用戶帳戶是1:1,這是我傾向於贊成的。此外,如果數據庫已損壞或未正確約束,則使用聯接可能不會爲給定用戶存在用戶首選項。

表中字段的限制取決於您的引擎。 5.5的答案可以在http://dev.mysql.com/doc/refman/5.5/en/column-count-limit.html找到。

2

分成三個表:

  • 成員
  • PREFERENCE_TYPE_CODE
  • MEMBER_PREFERENCES

MySQL有一個hard limit of 4,096 columns,但它不是理想的依賴於知識。上面的表結構I將允許您添加或刪除首選項,而不訴諸ALTER TABLE語句。它還將支持查詢誰特別偏愛某人。

+0

什麼是PREFERENCE_TYPE_CODE表格?這只是EAV嗎? – 2010-05-05 18:14:25

+0

@Mark:它看起來像一個EAV,但是在這裏您定義了'preference_type_codes'中的可能偏好集合,然後使用適當的關係爲'members_preferences'中的每個成員定義偏好,並具有適當的參照完整性約束,以及等等。這是一個非常好的方法。 +1 – 2010-05-05 18:20:45

+0

@Mark Canlas:「MEMBER_PREFERENCES」表是一個多對多的表格,用於將成員與他們的1+偏好相關聯。我沒有包括外鍵,對不起。 – 2010-05-05 18:27:40

0

21個字段相當多。這對MySQL不是問題,但我更喜歡單獨的表。

如果稍後可能會有更多的偏好,您甚至可以考慮一個通用3列表的偏好。列是類似的:

UserID 
PreferenceName 
PreferenceValue 

每行用戶首選項。您可能需要添加第4列才能存儲值列表。有效使用這種類型的數據庫模型需要支持多個結果集(因此您可以一次獲取所有用戶信息)。您可能想要檢查您的數據庫訪問技術是否支持它們。

當然,使用這種方法,您將失去爲每個偏好選擇數據類型的能力。作爲優勢,您可以擴展此模型以創建首選表,您可以在其中定義每個首選項的默認值。

# Fetch all preferences for a user, using defaults where no preferences are given 
SELECT p.PreferenceName, COALESCE(up.PreferenceValue, p.DefaultValue) 
FROM Preference p 
LEFT OUTER JOIN UserPreference up ON up.PreferenceID = p.ID 
WHERE up.UserID = ? 

這將允許您輕鬆地更改您網站的默認設置。

相關問題