2011-12-21 131 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

单独保存它们会使搜索等在每个领域的可能性。如果你序列化它们,那么搜索将变得困难/不可能。
你现在可能不需要,但它可能需要更进一步。

相关问题