4

我知道之前有人问过这个问题,最好的答案似乎如下: 保存用户偏好的最佳方法?

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

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

我在考虑以下几点:有一个代表所有用户偏好的二进制数:例如 1100011100 .. 每个位对应于一个特定的偏好

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

这样我只需要在我的用户表中有 1 个额外的列来存储偏好,并且它很容易通过简单地获取二进制数来比较两个用户之间的偏好

有没有人对如何做我想做的事情有任何其他想法,或者在我在这里尝试做事的方式中看到问题?

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

4

3 回答 3

2

我建议远离 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)
);

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

只是几个想法。

于 2012-04-14T20:55:06.773 回答
0

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

于 2012-04-12T06:54:45.430 回答
0

您的数据库是否必须回答以下问题:

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

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

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

于 2012-04-12T16:06:08.403 回答