将数据保存为数组或单个字段(php / MySQL)

时间:2011-12-21 01:41:39

标签: php mysql database serialization

我正在为用户/客户设计一个新系统,我在我的系统用户首选项中。在我开始创建代码和数据库之前,我想确保我做对了。

我有这些偏好:

  • 字体大小
  • font face
  • font color
  • 主题
  • 主页
  • 信息中心选项
  • 少数真/假选项,例如启用分享等......

等等。

我的想法是为每个首选项创建每个字段,但我也许我可以将对象或数组保存在blob中。

这是个好主意吗?

2 个答案:

答案 0 :(得分: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中的所有标头,然后使用该标识从user_preferences中选择用户所需的偏好值(也由ID标识)。请注意,当您删除user_preferences_headers中的条目时,所有链接到已删除行的ID的条目也将被删除。

答案 1 :(得分:3)

单独保存它们可以在每个字段上进行搜索等。如果你序列化它们,那么搜索将变得困难/不可能 您现在可能不需要它,但可能需要进一步下线。