Phi系数用例的键值存储(Redis)

时间:2019-09-01 18:25:01

标签: redis data-modeling correlation key-value-store

我想构建一个应用程序,用户可以在其中为日期(YYYY-MM-DD字符串)分配多个标签(字符串)。主要用例是为两个标签(A和B)的组合计算Phi coefficient,这需要将每个日期归入以下类别之一:

  1. 均未分配标签
  2. 已分配标签A,但未分配标签B
  3. 已分配标签B,但未分配标签A
  4. 分配了标签A和标签B

关键信息是每个类别有多少日期,而不是什么日期。

问题是,如何持久保存数据,以便快速查找数据以进行上述分类。

使用键值存储(例如Redis),以标记为键的存储集以及每个标记的日期为值的存储将是一种选择,它可以轻松地为存储填充新信息。对于查找,A和B的交集(SINTER)将构成第四类,A和B之间的差值(SDIFF)将分别与B和A构成第二和第三类。

问题仍然存在,如何计算第一类:日期数,标签A和B都不适用。我想到的唯一选择是通过遍历所有键来读出日期,并从日期总数中减去类别2、3和4的数目。有没有更优雅,更有效的方法来实现这一目标?还是针对该用例更好地使用SQL数据库?

编辑:另一个想法是不仅要按标签存储日期,还应按冗余方式存储标签,以便所有日期的检索更加容易。

1 个答案:

答案 0 :(得分:1)

这里有两种基本方法:以一种规范的形式存储数据,并根据需要使用它来计算派生数据;或以多种方式预先存储信息以优化查找速度。

到目前为止,您已采用第一种方法。很好,因为将信息存储在一个地方可以简化许多事情,并且消除了数据不一致的风险。缺点是计算派生值可能很慢。在您的情况下,您正在谈论最好的情况下的O(n)操作,而在最坏的情况下会遍历所有键。尽管在使事情变得更复杂之前总是值得进行性能测试,但我的直觉是您应该担心。

将派生数据与规范数据分开存储可以使您优化查找性能。最后一段建议以多种方式存储相同的信息,但是只要您这样做,就可以存储实际所需的派生值,而不是保留现有的按标签日期数据结构。

具体来说,我的建议是按日期存储标签,同时分别存储1-4类的计数。每次记录一个新的(或更改或删除的)输入值时,您都会更新规范的数据结构并更新计数。您可能可以使用相当简单的Lua script来自动执行此操作。然后,您可以在O(1)时间内访问所需的计数,并确信它们可以准确反映基础数据。