实现多集的标准方法?

时间:2014-02-28 09:02:10

标签: mysql multiset

我正在寻找在MySQL中实现multiset(“bag”)的标准方法。此多集可能包含的值仅为字符串。

背后的原因是计算;我有一个事件清单,我无法预定,我希望计算它们的出现次数。例如,在Python中,可以通过Counter完成此操作。

以前我问了一个关于sets in MySQL的问题;到目前为止,我发现的最佳解决方案是使用TEXT数据类型在数据库中放置逗号分隔的字符串,然后使用FIND_IN_SET查看元素是否在集合中。但是,这个解决方案不适合多集合,因为在文本字段中存储一个字符串,比如在文本字段中存储一千次,然后计数就不是那么有效......

用例是这样的:每当在我的(Python)脚本运行期间发生与给定行相关的事件时,我希望访问数据库并将该事件添加到数据库中的每一行;最后,我希望计算每一行中每个事件的发生次数。对我来说更重要的是,数据的插入将是有效的(与最终计算相比)。

修改

我的原始数据表包含数千行,每行都应该有一个“multiset字段”(这种或那种方式)。每个这样的多集可以包含不太多(例如,少于20个)的区分值,但是在多集中每个这样的值可以出现许多(例如,超过500)次。因此,等待稍后计数的每个值的字符串(或其他表示)可能是低效的(据我的理解)。例如,任何(原始)行的任何事件将成为一行的不同表可能会快速增长(数百万行)。

1 个答案:

答案 0 :(得分:2)

鉴于这是您现有的表格:

create table table1(thekey int primary key, random_info varchar(10))

创建您的事件表:

create table table1_event(thekey int not null, event varchar(100) not null, 
                     counter int, primary key(thekey, event))

每个活动:

insert into table1_event values(<a key>, 'the event', 1)
  on duplicate key update counter=counter+1

事件摘要:

select table1.thekey, table1_event.event, table1_event.counter
from table1 left outer join table1_event on table1.thekey=table1_event.thekey

编辑以反映海报中更改的问题和评论