Erlang Mnesia折叠记录,引用第二个表

Erlang Mnesia折叠记录,引用第二个表,erlang,mnesia,Erlang,Mnesia,我有一个类似这样的模式: -record(sale, { id, price, tax, sku, datetime }) -record(refund, { id, sale_id, datetime }) 销售表中约有600000条记录,而退款表中约有20000条记录 我需要折叠销售表中的数据,将每个sku与收到的金额(价格)和退款金额(通过选中#return.sale_id)进行分组 对于Mnesia,是否有一种有效的方法可以避免N+1查询问题,即对于折

我有一个类似这样的模式:

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

-record(refund, {
  id,
  sale_id,
  datetime
})
销售
表中约有600000条记录,而
退款
表中约有20000条记录

我需要折叠销售表中的数据,将每个
sku
与收到的金额(
价格
)和退款金额(通过选中
#return.sale_id
)进行分组


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

您的
销售
订购集
?如果是,您可以像往常一样进行合并联接。首先获得所有
退款
,并按
销售id
对其进行排序。然后只需将
sale
折叠起来,通过
sku
键累积到dict或ets中。

它是
set
,但我可以更改为
ordered\u set
,因为我没有使用
set
的具体原因(除了一点暗示,它可能更快)。你说的“像往常一样合并”是什么意思?我是否需要先将所有记录读入内存(由于表的大小,这可能是个问题)?啊,等等,你给了我一些新的关键字来帮助我,所以不要担心给出任何具体的例子:)我搜索了“mnesia merge join”,并在
qlc
中找到了对它的引用。。。我没有意识到查询列表理解可以进行连接:)但是我仍然担心内存的使用,因为记录不能全部放入内存,这就是为什么在我不得不考虑退款之前,我一直在使用折叠式销售表。添加qlc:是的,有文件证明,
qlc
支持合并联接,在他的情况下它可以工作。你可以试试。添加合并加入:要想获得荣誉,这不是像往常一样的合并加入。我经常使用这种技术,以至于我忘记了这并不常见。当我有更多的时间时,我试着详细说明一下。