我有一个带有整数键(时间戳)的表,其中包含应从数据库中删除特定记录的时间。还有一个清理查询,它从这个表中获取过期时间少于现在的记录并删除它们。
Erlang的文件说,有四种类型的表类型:set
,ordered_set
,bag
,和duplicate_bag
。
set
使用哈希表实现,因此读取时间复杂度为 O(1)。ordered_set
是使用树实现的,因此读取需要 O(log(n)) 时间复杂度,但它更好地适用于随后的间隔。bag
实施的信息。ordered_set
看起来很理想,但我不能使用它,因为两条记录可以具有相同的时间戳。所以问题是:
该bag
表是如何实现的,是否适合查询后续间隔?如果没有,我怎样才能获得“ ordered_bag
”功能?
Mnesiabag
是使用ETS
and实现的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
.
归档时间: |
|
查看次数: |
929 次 |
最近记录: |