【问题标题】:Mnesia: how the bag table type is implemented?Mnesia:bag table 类型是如何实现的?
【发布时间】:2013-10-06 03:22:07
【问题描述】:

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

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

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

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

bag 表是如何实现的,它是否适合查询后续间隔?如果没有,如何获得“ordered_bag”功能?

【问题讨论】:

  • 我认为排序对于时间相关的应用程序非常重要。表操作仅发生在行中的特定范围内。如果没有排序,您必须使用整个表(好的,有索引)。那么,为什么不使用像 {Timestamp,ID} 这样的元组键,其中 ID 是任意值(在元组中的第二个位置以保留时间戳排序)。为什么必须有时间戳作为键?

标签: erlang mnesia


【解决方案1】:

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

  1. Learn You Some Erlang
  2. Erlang -- mnesia:create_table/2
  3. Erlang Programming by Fransecso Cesarini and Simon Thompson, Ch.10
  4. Erlang and OTP in Action by Martin Logan, Eric Merritt, and Richard Carlsson, Ch.9

关于问题的其余部分:

不,bag 不适合查询后续间隔。得到一个间隔 从bag 表你必须完全遍历它。我看到两个可能的决定 那个。

首先,您可以使用额外的ordered_set 表来保持秩序,如 @niahoo 建议。因此,您将能够有效地查询属于某个区间的所有时间戳,并且 然后从您的 bag 表中删除相应的条目,这也将是有效的,因为 到这里你就知道所有的键了。

第二,可以使用ordered_set{timestamp, [values]}。这将需要在插入时进行额外的手动工作 并删除单个条目,但它会使您免于创建其他表 如果您只需要按timestamp 分组查询它们。

【讨论】:

  • 为什么要使用一元元组而不是单个时间戳?
  • 哦,是的,我看错了你的帖子,我以为你在谈论关键领域,而不是整个记录。
  • 请注意最小 mnesia 元组大小为 3
  • @niahoo 谢谢你,你是对的(但它是 2,而不是 3)。我想我只是从ETS 插值。我更新了答案。
  • @niahoo 我认为您对具有最小元组大小的 mnesia 表中的最小属性数(即 2)感到困惑。由于表中的每条记录都将表示为格式为{table_name, key, attribute_1}的元组,因此mnesia中元组的最小大小确实是3。如果我错了,请纠正我。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    • 2017-11-28
    • 2016-12-05
    • 2018-10-29
    • 1970-01-01
    • 2023-03-08
    • 2021-07-02
    相关资源
    最近更新 更多