2012-04-12 39 views
3

我知道这个问题以前有人问,最好的答案似乎是以下几点: Best approach to save user preferences?的最佳方式 - BINARY或INT

但是我有一些附加条件是为什么我再次提出这个问题,我需要能够将1个用户的偏好与另一个用户的偏好进行比较,并快速获取这两个用户之间的差异。 做到这一点?

我在考虑如下几行:有一个代表所有用户喜好的二进制数字:例如1100011100 .. 每一位对应于一个特别优选

,然后或者将其保存为类型BINARY(哪里可以存储255个比特,即255个偏好设置 - 是吗?) 或隐蔽的二进制转换成int和存储它作为一个int(然后选择INT或BIGINT之间 - INT = 4 * 8 = 32位,BIGINT = 8 * 8 = 64位)

这样我只需要在我的用户表中有1个额外的列存储偏好和它很容易通过简单地以二进制数

比较两个用户之间的偏好

有没有人有关于如何做什么,我试图做任何其他的想法或者以我想在这里做事情的方式看问题?

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

回答

0

的整数想法听起来这个问题最好的方法,你可以有一个存储过程或等效在MySQL,将你的整数转换为位表示过。您可以查看以下问题SQL Server Convert integer to binary string以了解有关如何执行此操作的详细信息。

0

将数据库曾经有来回答这个问题:

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

场内编码比特防止DBMS索引从每个这些位的和应答上述有效的问题。

一般来说,违反了atomicity(因此1NF)的原则应确实有些很好的理由是合理的。真相被告知,你可能在这里有这样的理由,对于特定的(狭义的)查询类节省空间和性能。只要确保将来放弃永久不会需要的灵活性。

2

我建议远离二进制位掩码选项,因为它使用特定设置查询用户非常困难。

我看到完成的一种方法是使用数据库中的键值对。

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

这不会有大量的用户很好地扩展,但它可以很容易地添加任何数字键/值组合,而无需修改datbase。

你可以用settingsKey表和设置值表更有效率地做类似的事情。

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



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

哪一个比原始设置表更有效率,并且您将能够存储任意数量的可能设置而不必修改模式。

只是一些想法。

+1

你能否详细说明一下?什么是大量的用户? 5000个用户可以接受吗? – hfatahi 2016-01-06 18:47:53