在MySQL中保存用户首选项的最有效方法是什么?

时间:2012-10-24 22:05:09

标签: mysql database database-design structure

我想知道为网站保存大量用户偏好的最佳策略是什么。大多数情况下的默认值,如默认时区,默认文本大小等。为每个设置创建一个单独的列听起来不太实际。我目前唯一能想到的方法是在users表中为首选项添加一个单列,并将所有设置放在那里。

例如,我只能在一列中使用这样的格式:timezone:GMT;text_size:12;default_value1:something;default_value2:FALSE。然后当在PHP中抓取它时,我会为登录用户选择此列并对结果进行爆炸,设置$ _SESSION ['settings'] ['setting_key'] =“setting_value”。

有更明智的方法可以做到这一点,还是我已经朝着正确的方向前进了?当然,唯一的缺点是无法搜索每个特定的设置,因为所有内容都集中在一起。

2 个答案:

答案 0 :(得分:4)

恕我直言,serialize只是完美的意思。

如果您想要搜索它,您可能希望最终将它们分开。 另一方面,您可能希望采用完全不同的方法,而不是存储在每列设置的大表中,您可以创建一种类型的表:

CREATE TABLE settings (user_id INT, setting VARCHAR, value VARCHAR)

并存储类似的设置。然后,您不受添加/删除列的限制。

另一种方法(进一步加快可能的设置查找)将创建多个表:

CREATE TABLE settings (id INT, setting VARCHAR)
CREATE TABLE settings_values (user_id INT, setting_id INT, value VARCHAR)

考虑到setting_idsettings.id的外键并假设您有一些users表具有用户ID,其中user_id是两个示例中的外键

答案 1 :(得分:2)

我会选择“每个偏好列”选项;毕竟,你的程序必须存储首选项然后检索它们,所以它不会像你的程序不知道如何处理的偏好一样浮动。

我在我编写和维护的数据库程序中有一个类似的系统,其中每个用户每个屏幕可能保存十个首选项。在此基础上存储会降低复杂性。

您考虑存储多少偏好?我怀疑它会超过十个。

如果您要一次性检索所有首选项,然后立即存储所有,那么可以使用连接字符串方法,但通常我我不建议这样做,因为它使个人更难以访问偏好。