我有一个带有整数键(时间戳)的表,其中包含应从数据库中删除特定记录的时间。还有一个清理查询,它从这个表中获取过期时间少于现在的记录并删除它们。
Erlang的文件说,有四种类型的表类型:set,ordered_set,bag,和duplicate_bag。
set 使用哈希表实现,因此读取时间复杂度为 O(1)。ordered_set 是使用树实现的,因此读取需要 O(log(n)) 时间复杂度,但它更好地适用于随后的间隔。bag实施的信息。ordered_set看起来很理想,但我不能使用它,因为两条记录可以具有相同的时间戳。所以问题是:
该bag表是如何实现的,是否适合查询后续间隔?如果没有,我怎样才能获得“ ordered_bag”功能?
Mnesiabag是使用ETSand实现的DETS,其他表类型 [1] 也是如此。此外,Mnesia 不支持duplicate_bag表格 - 您可以从文档 [2] 中看到它。因此,我们可以得出结论bag,Mnesia 被实现为哈希表并且具有恒定的查找时间,因为ETS和DETS bag被实现为哈希表 [3]。[4] 也说set和bag在 Mnesia 中作为哈希表实现。
关于剩下的问题:
不,bag不适合查询后续间隔。要从bag表中获取间隔,您必须完全遍历它。我看到了两个可能的决定。
首先,ordered_set正如@niahoo 建议的那样,您可以使用附加表来保持秩序。因此,您将能够有效地查询一个区间内的所有时间戳,然后从bag表中删除相应的条目,这也将是有效的,因为此时您将知道所有键。
其次,你可以使用ordered_set的
{timestamp, [values]}。这将需要额外的手动操作来插入和删除单个条目,但如果您只需要按timestamp.