我正在爲用戶/客戶端設計一個新系統,並且在我的系統用戶首選項中有。在我開始創建代碼和數據庫之前,我想確保我做的是正確的事情。將數據保存爲數組或單個字段(php/MySQL)
我有這些喜好:
- 字體大小
- 字型
- 字體顏色
- 主題
- 首頁
- 儀表盤選項
- 幾個真/假選項,如啓用共享等...
以上。
我的想法是爲每個偏好創建每個字段,但我也許我可以將對象或數組保存在一個blob中。
這是一個好主意嗎?
我正在爲用戶/客戶端設計一個新系統,並且在我的系統用戶首選項中有。在我開始創建代碼和數據庫之前,我想確保我做的是正確的事情。將數據保存爲數組或單個字段(php/MySQL)
我有這些喜好:
以上。
我的想法是爲每個偏好創建每個字段,但我也許我可以將對象或數組保存在一個blob中。
這是一個好主意嗎?
您可以創建一個輔助表來保留對屬性名稱的引用。然後,您可以將該表與用戶標識與其中一個屬性的標識之間的合併表—關聯起來。這樣做,你可以隨時更改屬性。
使用外鍵您還可以「級聯刪除」具有不再存在的屬性的用戶詳細信息。此外,您可以確保只添加對有效屬性名稱的引用,並使用索引優化搜索。
假設:
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的所有條目也將被刪除。
單獨保存它們會使搜索等在每個領域的可能性。如果你序列化它們,那麼搜索將變得困難/不可能。
你現在可能不需要,但它可能需要更進一步。
+1用於標準化。這是一個非常好的主意IMO。 – Herbert 2011-12-21 02:17:08