【问题标题】:Standard way of implementing a multiset?实现多集的标准方法?
【发布时间】:2014-02-28 09:02:10
【问题描述】:

我正在寻找一种在 MySQL 中实现多重集(“包”)的标准方法。这个多重集可能包含的值只是字符串。

背后的原因是计数;我有一个我无法预先定义的事件列表,我希望计算它们的发生次数。例如,在 Python 中,这可以通过 Counter 来完成。

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

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

编辑

我的原始数据表包含数千行,每行都应该有一个“多集字段”(一种或另一种方式)。每个这样的多重集可能包含不会太多(例如,少于 20 个)可区分值,但是每个这样的值可能在多重集中出现很多(例如,超过 500 个)次。因此,等待稍后计算的每个值的字符串(或其他表示形式)可能效率低下(据我所知)。例如,一个不同的表,其中任何(原始)行的任何事件都会产生一行,它可能会迅速增长到非常大(数百万行)。

【问题讨论】:

    标签: mysql multiset


    【解决方案1】:

    鉴于这是您现有的表:

    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
    

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

    【讨论】:

    • 也许你想group by table1_event.event?无论如何,这确实可以解决我的问题。但是,由于我的任何原始行都可能包含约 100000 个事件,并且我可能有数千个原始行,这听起来有点低效。我将编辑我的问题。
    猜你喜欢
    • 2016-09-04
    • 1970-01-01
    • 2014-12-23
    • 2021-09-26
    • 2020-08-30
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多