【问题标题】:What is the most efficient way to save user preferences in MySQL?在 MySQL 中保存用户首选项的最有效方法是什么?
【发布时间】:2012-10-15 01:03:07
【问题描述】:

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

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

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

【问题讨论】:

    标签: mysql database database-design structure


    【解决方案1】:

    恕我直言,这就是 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 的外键并假设您有一些具有用户ID 的users 表,其中user_id 在这两个示例中都是外键。

    【讨论】:

    • 这将如何处理不同的数据类型?例如,我可以有 boolean、int 或 varchar 值。这难道不是可搜索的问题吗?
    • 另外,你的最后一种方法是如何加快速度,在不同的表中设置设置和值?这似乎只会使事情复杂化。
    • 然后您可以通过 id 而不是字符串来查找设置,select 子句会快得多。关于类型,我猜你必须在软件中进行类型转换。这不是非常理想,但它每个设置都有列的方法:)
    【解决方案2】:

    我会选择“按偏好列”选项;毕竟,您的程序必须存储首选项然后检索它们,因此不会出现您的程序不知道如何处理的首选项。

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

    您考虑存储多少首选项?我怀疑它会超过十个。

    如果您要一次性检索 all 首选项,然后一次性存储它们 all,那么可以使用串联字符串方法,但通常我不建议这样做,因为它会使访问个人偏好变得更加困难。

    【讨论】:

    • 您将它们存储在单独的设置列中,还是直接存储在用户表中?谢谢。
    • 这取决于:因为我在每个屏幕上存储数据,所以首选项存储在一个单独的表中,其中包含字段 user id|screen id|preference 1|preference 2|等等。每个用户的原子数据可以直接存储在用户表中。
    • 多少列太多了?我大约 25 岁左右.. 我可以看到达到 50.. 在这一点上分开不是最好的选择吗?
    • 如何将它们存储在“二进制”值中。将 2 的幂值赋予每个偏好。例如第一偏好 = 1,第二偏好 = 2,第三偏好 = 4。然后检查“二进制值”是否有每一位。一个 int 字段中的所有首选项。这会是一件好事吗?
    猜你喜欢
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    相关资源
    最近更新 更多