【问题标题】:Mnesia fold over records, referencing a second tableMnesia 折叠记录,引用第二个表
【发布时间】:2013-04-18 03:07:18
【问题描述】:

我有一个类似这样的架构:

-record(sale, {
  id,
  price,
  tax,
  sku,
  datetime
})

-record(refund, {
  id,
  sale_id,
  datetime
})

sale 表中有大约 600,000 条记录,refund 表中有大约 20,000 条记录。

我需要折叠销售表中的数据,将每个 sku 与收到的金额 (price) 和退款的金额(通过检查 #refund.sale_id)分组。

是否有一种有效的方法可以使用 Mnesia 来避免 N+1 查询问题,其中对于折叠操作中的每个 sale,我需要再次调用 mnesia 以查看是否存在退款?某种方式进行简单的连接?

【问题讨论】:

    标签: erlang mnesia


    【解决方案1】:

    你的sale 表是ordered_set 吗?如果是,您可以像往常一样进行合并连接。首先获取所有refund 并按sale_id 对其进行排序。然后只需折叠sale 并通过sku 键累积到 dict 或 ets 中。

    【讨论】:

    • 它是set,但我可以更改为ordered_set,因为我没有使用set 的具体原因(除了暗示它可能更快)。 “像往常一样进行合并连接”是什么意思?我是否需要先将所有记录读入内存(由于表的大小,这可能是个问题)?
    • 啊等等,你给了我一些新的关键字来帮助我自己,所以不用担心给出任何具体的例子:) 我搜索了“mnesia merge join”并找到了对它的引用在qlc... 我没有意识到查询列表推导可以做连接:)
    • 我仍然担心内存的使用,因为记录并不都适合内存,这就是为什么我只在销售表上使用折叠,直到我不得不考虑退款.
    • 添加 qlc:是的,有文件证明 qlc 支持合并连接,它可以在他的情况下工作。你可以试试。
    • 添加合并连接:老实说,它不像往常一样合并连接。我经常使用这种技术,以至于我倾向于忘记这种技术并不常见。当我有更多时间时,我会尝试详细说明。
    猜你喜欢
    • 1970-01-01
    • 2015-03-05
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    • 2017-05-29
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    相关资源
    最近更新 更多