2011-12-21 99 views
10

我正在爲用戶/客戶端設計一個新系統,並且在我的系統用戶首選項中有。在我開始創建代碼和數據庫之前,我想確保我做的是正確的事情。將數據保存爲數組或單個字段(php/MySQL)

我有這些喜好:

  • 字體大小
  • 字型
  • 字體顏色
  • 主題
  • 首頁
  • 儀表盤選項
  • 幾個真/假選項,如啓用共享等...

以上。

我的想法是爲每個偏好創建每個字段,但我也許我可以將對象或數組保存在一個blob中。

這是一個好主意嗎?

回答

12

您可以創建一個輔助表來保留對屬性名稱的引用。然後,您可以將該表與用戶標識與其中一個屬性的標識之間的合併表—關聯起來。這樣做,你可以隨時更改屬性。

使用外鍵您還可以「級聯刪除」具有不再存在的屬性的用戶詳細信息。此外,您可以確保只添加對有效屬性名稱的引用,並使用索引優化搜索。

假設:

CREATE TABLE user_preferences_headers 
(
    `id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT, 
    `name` VARCHAR(255) NOT NULL 
); 

CREATE TABLE `users` 
(
    `id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT, 
    `name` VARCHAR(255) NOT NULL, 
    `pass` VARCHAR(255) NOT NULL 
); 

CREATE TABLE `user_preferences` 
(
    `id_user` INT NOT NULL, 
    `id_preference_entity` INT NOT NULL, 
    `value` VARCHAR(255) 
); 

ALTER TABLE `user_preferences` ADD INDEX (`id_user`); 
ALTER TABLE `user_preferences` ADD INDEX (`id_preference_entity`); 

ALTER TABLE `user_preferences` ADD FOREIGN KEY (`id_user`) REFERENCES `users` (
`id` 
) ON DELETE CASCADE ON UPDATE CASCADE ; 
ALTER TABLE `user_preferences` ADD FOREIGN KEY (`id_preference_entity`) REFERENCES `user_preferences_headers` (
`id` 
) ON DELETE CASCADE ON UPDATE CASCADE ; 

現在你首先按名稱選擇從user_preferences_headers所有標題,或沒有,你使用id選擇從用戶的期望偏好值(由ID還標識) user_preferences。請注意,當您刪除user_preferences_headers中的條目時,鏈接到已刪除行的ID的所有條目也將被刪除。

+0

+1用於標準化。這是一個非常好的主意IMO。 – Herbert 2011-12-21 02:17:08

3

單獨保存它們會使搜索等在每個領域的可能性。如果你序列化它們,那麼搜索將變得困難/不可能。
你現在可能不需要,但它可能需要更進一步。