处理复杂数据过滤器

时间:2011-06-14 15:26:58

标签: database filtering relational-database rdbms

我正试图找出处理以下情况的最佳方法。

假设我们有一个具有属性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)。

首先想到的是拥有一些持续运行的流程,该流程定期根据定义的过滤器对每个消费者进行实体搜索,然后通知消费者是否找到新实体。这可行,但我不确定有数千个复杂的查询一直在运行是一个好主意。是否存在性能密集程度较低的替代方案,或者我对性能的关注还为时过早?

3 个答案:

答案 0 :(得分:1)

尝试使用二进制密钥。如果您采用上面的示例,如果A,B和C的选项数量有限,则为每个选项指定一个值,并将其表示为二进制值。例如,对于A,B和C,有1到8之间的选项。在二进制字符串中,a可以是000到111的任何值。对于选项B和C也可以这样说。然后通过将数字加在一起,你有一个可以表示为A,B和C的选项选择的任何选项的键。使用第一个或最后一个选项来表示ALL(即无过滤器)。

样本密钥可以是010 001 111(010 = A1; 001 = B12; 111 = C中的任何选项)

将二进制密钥转换为整数值:E.g 010001111 = 143作为小数。

然后是SELECT * FROM Customers的SQL查询WHERE CustomerStoredFilterKEY IN(143,155,152)

将很快返回结果

答案 1 :(得分:0)

这是非常高级别,因为我之前从未做过这样的事情,而且这很大程度上取决于其他进程是什么,但是我的头脑却是...... / p>

您可以在插入调用时触发一些代码将消息写入消息队列,该消息队列指定新记录匹配的过滤器。然后,您的消费者以某种方式从队列中获取消息,并找出他们有兴趣消费的插入记录。这消除了让进程不断查询和轮询表的问题,但增加了插入表中的开销。

答案 2 :(得分:0)

如果要动态构建此查询,那么假设合理的索引,性能应该没问题。毕竟,它将解析为每个查询的单个select语句。

如果是我,我会更关心将每个属性硬编码为表格列。您可能需要考虑将属性设置为子表 - 但是,对性能产生负面影响。

我对此不太确定,但我想知道如果MySQL作为单独的select语句完成,那么MySQL是否会更好地处理这些OR。当然,你可以用'解释'等来测试它。