如何解决处理复杂数据过滤器
| 我正在尝试找出解决以下情况的最佳方法。 假设我们有一个具有属性A,B和C的实体类型。这些属性中的每一个都可以具有一组已知的可能值。实体的消费者仅对具有某些属性值的实体感兴趣。这是使用过滤器定义的。例如(3个过滤器):A B C
A1 B12 C4
A3 B2 -
A11 - C2
Ax,Bx和Cx是特定值,\'-\'表示\'任何值\'。过滤器值进行AND运算,多个过滤器进行OR运算。最终的组合如下所示:
(A=A1 AND B=B12 AND C=C4) OR (A=A3 AND B=B2) OR (A=A11 AND C=C2)
当实体保存到数据库中时,我想通知某些使用者有关它的信息。要通知的使用者是那些已定义至少一个与已保存实体的属性值匹配的过滤器的使用者。
我期望有成千上万的消费者,每个消费者都定义了多个过滤器。大概还有30个属性。整个过程将使用关系数据库(MySQL)。
首先想到的是拥有一个连续运行的过程,该过程会定期使实体根据其定义的过滤器搜索每个使用者,然后在发现新实体时通知使用者。这会起作用,但是我不确定始终运行数千个稍微复杂的查询是一个好主意。是否有其他不占用大量性能的替代方案,还是我担心性能过早?
解决方法
尝试使用二进制密钥。如果以上面的示例为例,则A,B和C的选项数量有限,然后为每个选项分配一个值,并将其表示为二进制值。例如,对于A,B和C,选项在1到8之间。在二进制字符串中,a可以是000到111之间的任何值。对于选项B和C也可以如此。然后将数字加在一起,就得到一个可以代表可以为A,B和C选项选择的任何选项的键。使用第一个或最后一个选项代表ALL(即没有过滤器)。
样本键可能是010001111(010 = A1; 001 = B12; 111 = C中的任何选项)
将二进制密钥转换为整数值:例如,十进制为010001111 = 143。
然后执行SQL * SELECT * FROM Customers WHERE CustomerStoredFilterKEY IN(143,155,152)的SQL查询
会很快返回结果
, 这是非常高级的,因为我以前从未做过这样的事情,而且它在很大程度上取决于其他过程,但是我却无法解决。
您可以在插入调用触发器上添加一些代码,以将消息写入消息队列,该消息队列指定新记录匹配的过滤器。然后,您的使用者从队列中以某种方式获取消息,并找出他们感兴趣的插入记录。这消除了使进程不断查询和轮询表的问题,但是增加了插入表的开销。
, 如果要动态构建此查询,则假定索引合理,性能应该会很好。毕竟,它将为每个查询解析为单个select语句。
如果是我,我会更关心将每个属性硬编码为表列。您可能要考虑使属性成为子表-但这会对性能产生负面影响。
我对此不太确定,但是我想知道,如果将它们作为单独的选择语句然后通过一个联合来完成,那么MySQL是否会更好地处理那些OR。当然,您可以使用\'explain \'等进行测试。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。