2

我有一个带有整数键(时间戳)的表,其中包含应从数据库中删除特定记录的时间。还有一个清理查询,它从这个表中取出过期时间比现在短的记录并删除它们。

Erlang 文档说,有四种类型的表类型:setordered_setbagduplicate_bag.

  • set是使用哈希表实现的,因此读取需要 O(1) 时间复杂度。
  • ordered_set是使用树实现的,因此读取需要 O(log(n)) 时间复杂度,但它更好地适用于后续间隔。
  • 我没有找到有关bag实施的信息。

ordered_set看起来很理想,但我不能使用它,因为两条记录可以有相同的时间戳。所以问题是:

bag表是如何实现的,查询后续间隔是否很好?如果没有,我怎样才能获得“ ordered_bag”功能?

4

2 回答 2

5

Mnesiabag是使用ETSand实现的DETS,其他表类型 [1] 也是如此。此外,Mnesia 不支持duplicate_bag表格 - 您可以从文档 [2] 中看到它。因此,我们可以得出结论bag,Mnesia 被实现为哈希表并且具有恒定的查找时间,因为ETSDETS bag被实现为哈希表 [3]。[4] 也这么说,set并且bag在 Mnesia 中被实现为哈希表。

  1. 学习一些 Erlang
  2. 二郎 -- mnesia:create_table/2
  3. Erlang Programming by Fransecso Cesarini 和 Simon Thompson,第 10 章
  4. Erlang and OTP in Action by Martin Logan、Eric Merritt 和 Richard Carlsson,第 9 章

关于问题的其余部分:

不,bag不适合查询后续间隔。要从bag表中获取间隔,您必须完全遍历它。我看到了两个可能的决定。

首先ordered_set,正如@niahoo 建议的那样,您可以使用附加表来保持秩序。因此,您将能够有效地查询落在某个时间间隔内的所有时间戳,然后从bag表中删除相应的条目,这也是有效的,因为此时您将知道所有键。

是可以使用ordered_set{timestamp, [values]}。这将需要在插入和删除单个条目时进行额外的手动工作,但如果您只需要查询按timestamp.

于 2013-09-30T10:38:59.660 回答
0

我认为您应该首先考虑您必须对数据库执行的最频繁和时间关键的请求以选择正确的组织和主键,我假设(但可能是错误的)它不是时间戳,也不是清理功能.

如果我是正确的,您可以简单地使用dirty_first() 和dirty_next() 函数遍历表,以使扰动尽可能短(我认为dirty 函数是可以的,因为不存在修改时间戳的风险。在操作,无论如何,如果您不清理条目,您将在下一次迭代中执行此操作)。

最后,如果清理时间真的很关键,但时间戳对您的应用程序来说不是最重要的键,您可以使用最佳键将数据存储在一个集合中,并在单独的有序集合表中存储时间戳(主键)和列表关联的键。

于 2013-09-30T16:53:44.837 回答