Database 处理复杂数据过滤器

Database 处理复杂数据过滤器,database,filtering,relational-database,rdbms,Database,Filtering,Relational Database,Rdbms,我正试图找出处理以下情况的最佳方法 假设我们有一个具有属性A、B和C的实体类型。每个属性都可以有一组已知的可能值。实体的使用者只对具有特定属性值的实体感兴趣。这是使用过滤器定义的。例如(3个过滤器): Ax、Bx和Cx是特定值,“-”表示“任何值”。过滤器值为AND'ed,多个过滤器为OR'ed。最终组合如下所示: (A=A1 AND B=B12 AND C=C4) OR (A=A3 AND B=B2) OR (A=A11 AND C=C2) 当一个实体被保存到数据库中时,我想通知某些消费者。

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

假设我们有一个具有属性A、B和C的实体类型。每个属性都可以有一组已知的可能值。实体的使用者只对具有特定属性值的实体感兴趣。这是使用过滤器定义的。例如(3个过滤器):

Ax、Bx和Cx是特定值,“-”表示“任何值”。过滤器值为AND'ed,多个过滤器为OR'ed。最终组合如下所示:

(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选择的任何选项。使用第一个或最后一个选项表示所有选项(即无过滤器)

然后,示例键可以是010 001 111(010=A1;001=B12;111=C中的任何选项)

将二进制键转换为整数值:例如,将010001111=143转换为十进制

然后,从CustomerStoredFilter输入的客户处执行SELECT*的SQL查询(143155152)


将很快返回结果

尝试使用二进制键。如果您以上面的示例为例,如果a、B和C的选项数量有限,则为每个选项分配一个值,并将其表示为二进制值。例如,对于A、B和C,有介于1和8之间的选项。在二进制字符串中,A可以是从000到111的任意值。选项B和C也是如此。通过将数字相加,您有一个键可以表示为选项A、B和C选择的任何选项。使用第一个或最后一个选项表示所有选项(即无过滤器)

然后,示例键可以是010 001 111(010=A1;001=B12;111=C中的任何选项)

将二进制键转换为整数值:例如,将010001111=143转换为十进制

然后,从CustomerStoredFilter输入的客户处执行SELECT*的SQL查询(143155152)


将非常快地返回结果

如果动态构建此查询,则性能应该良好,假设索引合理。毕竟,它将为每个查询解析为一个select语句

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


我对此不太确定,但我想知道,如果MySQL将这些OR作为单独的select语句进行处理,然后通过联合处理,是否会更好地处理它们。当然,您可以使用“explain”等来测试这一点。

如果您是动态构建此查询,那么在假设索引合理的情况下,性能应该是良好的。毕竟,它将为每个查询解析为一个select语句

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


我对此不太确定,但我想知道,如果MySQL将这些OR作为单独的select语句进行处理,然后通过联合处理,是否会更好地处理它们。当然,您可以使用“explain”等来测试这一点。

在插入时查找新插入的实体匹配的过滤器可能成本过高(对照所有定义的过滤器检查实体的属性值)。在插入时查找新插入的实体匹配的过滤器可能成本过高(对照所有定义的过滤器检查实体的属性值)。这是一个有趣的想法,但是如果
(A=A1 AND B=B12 AND C=C4) OR (A=A3 AND B=B2) OR (A=A11 AND C=C2)