【问题标题】:Best way to store user preferences for a website in MySQL - BINARY or INT在 MySQL 中存储网站用户首选项的最佳方式 - BINARY 或 INT
【发布时间】:2014-06-17 17:08:14
【问题描述】:

我知道以前有人问过这个问题,最好的答案似乎如下: Best approach to save user preferences?

但是我有一些额外的标准,这就是我再次问这个问题的原因,我需要能够将 1 个用户的偏好与另一个用户的偏好进行比较,并快速了解这两个用户之间的差异 所有用户偏好都是布尔值

实现这一目标的最佳方法是什么?

我的想法如下:有一个代表所有用户偏好的二进制数:例如1100011100.. 每个位对应一个特定的偏好

然后将其保存为 BINARY 类型(我可以在其中存储 255 位,即 255 首选项设置 - 对吗?) 或将二进制转换为 int 并将其存储为 int(然后选择 INT 或 BIGINT - INT = 4*8 = 32 位,BIGINT = 8*8 = 64 位)

这样我只需要在我的用户表中增加 1 个额外的列来存储偏好,并且只需获取二进制数即可轻松比较两个用户之间的偏好

是否有人对如何做我正在尝试做的事情有任何其他想法,或者在我在这里尝试做事情的方式中发现问题?

(注意数据库不是我的强项)

【问题讨论】:

    标签: mysql database database-design


    【解决方案1】:

    我建议不要使用 BINARY Bitmask 选项,因为它使查询具有特定设置的用户变得非常困难。

    我见过的一种方法是使用数据库中的键值对。

    SettingsTable
    (
      FkUserId int,
      SettingKey varchar(1024),
      SettingValue varchar(1024)
    );
    

    这不适用于大量用户,但它可以轻松添加任意数量的键/值组合,而无需修改数据库。

    您可以使用 settingsKey 表和设置值表以更有效的方式执行类似操作。

    SettingsKeys
    (
      KeyId int,
      SettingKey varchar(1024)
    );
    
    
    
    SettingsTable
    (
      FkUserId int,
      FkKeyId int,
      SettingValue varchar(1024)
    );
    

    这将比原始设置表更有效,并且您可以存储任意数量的可能设置,而无需修改架构。

    只是一些想法。

    【讨论】:

    • 您能详细说明一下吗?什么是大量用户? 5000 个用户是否可以接受?
    【解决方案2】:

    您的数据库是否必须回答这个问题:

    对于给定的偏好,哪些用户拥有它?

    对字段中的位进行编码会阻止 DBMS 对这些位中的每一个进行索引并有效地回答上述问题

    一般来说,违反atomicity(因此是1NF)的原则确实应该有一些很好的理由。说实话,您实际上可能在这里有这样的原因,在空间节省和特定(窄)类查询的性能方面。只要确保将来不再需要您失去的灵活性即可。

    【讨论】:

      【解决方案3】:

      您的 Integer Idea 听起来是解决问题的最佳方法,您可以在 mysql 中有一个存储的 proc 或等效程序,它也可以将您的整数转换为位表示。您可以查看以下问题SQL Server Convert integer to binary string,了解如何执行此操作的详细信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-12
        • 2011-05-09
        • 1970-01-01
        • 2011-09-25
        • 1970-01-01
        • 1970-01-01
        • 2011-01-17
        • 1970-01-01
        相关资源
        最近更新 更多