在MySQL中存储网站用户偏好的最佳方式 - 二进制还是整数?

4
我知道这个问题以前已经被问过,最好的答案似乎是以下链接: 最佳保存用户偏好的方法? 然而,我有一些额外的条件,这就是为什么我再次提出这个问题的原因。我需要能够比较一个用户的偏好和另一个用户的偏好,并快速地得到两个用户之间的差异。所有用户的偏好都将是一个布尔值。
什么是实现这个的最佳方式?
我考虑以下方面:使用二进制数字来表示所有用户的偏好:例如1100011100...每个位对应于特定的偏好。
然后,将其保存为BINARY类型(其中可以存储255位,即255个偏好设置 - 是吗?),或将二进制转换为int并将其存储为int(然后选择INT或BIGINT之间的选择- INT = 4 * 8 = 32位,BIGINT = 8 * 8 = 64位)。
这样,我只需要在我的用户表中有一个额外的列来存储偏好,通过简单地获取二进制数,就可以轻松比较两个用户之间的偏好。
是否有其他关于如何执行我尝试做的事情或者看到我在这里尝试做事情的问题的想法?
(注意,数据库不是我的强项。)
3个回答

2

我建议不要使用二进制位掩码选项,因为这会使得查询具有特定设置的用户变得非常困难。

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

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

这种方法在用户数量较大时不易扩展,但是可以轻松添加任意数量的键/值组合而无需修改数据库。

您可以使用settingsKey表和settings values表以更有效的方式实现类似的功能。

SettingsKeys
(
  KeyId int,
  SettingKey varchar(1024)
);



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

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

只是一些想法。


1
你能详细说明一下吗?什么是大量用户?5000个用户可以接受吗? - hfatahi

0

你的整数想法听起来是解决这个问题的最佳途径,你可以在MySQL中使用存储过程或等效方法将整数转换为位表示。你可以查看以下问题SQL Server Convert integer to binary string以了解如何执行相同的操作。


0

您的数据库是否需要回答以下问题:

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

在字段内编码位会阻止DBMS索引每个位并高效地回答上述问题。

一般来说,违反 原子性 原则(因此违反了 1NF)应该有非常充分的理由。实话实说,在特定(狭窄)查询类别的空间节省和性能方面,您可能确实有这样的理由。只需确保您失去的灵活性在未来永远不会被需要即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接