PostgreSQL中的等价于MongoDB的Capped collection是什么?

10
MongoDB的基本概念是,“封顶集合”允许您设置表格的最大大小,当达到大小限制时,系统将清除旧数据。

是否有人在PostgreSQL中设计了类似的设置并在生产环境中使用了它?


2
实现分区并以编程方式删除旧分区,仅保留最近的一个可能会起作用。理论上,它应该比从表中删除行的性能要好得多。 - Marquez
2个回答

11
这里有一个简单的解决方案,适用于数据量不太大且性能要求不太高的情况。
首先,让我们创建我们的表格。我们将拥有一个id列和一个data列,但您可以根据您的特定情况添加任何需要的列。
CREATE TABLE capped_collection (
  id integer NOT NULL,
  data text);

现在,我们为主键创建一个序列,将MAXVALUE设置为所需的封顶集合大小,并使用CYCLE选项,以便序列将计数到MAXVALUE,然后重新从1开始。
CREATE SEQUENCE capped_collection_id_seq
  START WITH 1
  INCREMENT BY 1
  MINVALUE 1
  MAXVALUE 10000
  CACHE 1
  CYCLE
  OWNED BY capped_collection.id;

在下一步(这里未显示),您应该使用MAXVALUE记录预填充表格。我们这样做是为了使每个id值都有一行,并且我们不必担心决定是否执行INSERT或UPDATE操作,只需保持简单和高效即可。
现在,我们的表已设置好,每当我们想要插入新行时,我们会执行以下UPDATE操作。
UPDATE capped_collection
SET data = 'your data here'
WHERE id = (SELECT nextval('capped_collection_id_seq'))
nextval 命令获取下一个 id,因为我们指定了 CYCLE,所以它将在达到 MAXVALUE 后回到 1。最终结果是您的表中只会有 MAXVALUE 行,其中最旧的条目将被删除。
(来自http://www.rigelgroupllc.com/blog/2014/10/14/capped-collections-in-postgres/

6

我从未听说过类似的事情。我想你可以通过使用以下方法模拟带限制表大小或循环队列:

特别有趣的是bovine的回答(即查看未被接受的答案)。

引入一个表示“集合”中索引的列和该列的序列后,每个upsert可基于以下条件进行:

where index = (sequence.nextval % max collection size)

4
实际上,只需将序列的循环值设置为最大集合大小即可。这使您可以使用一个upsert触发器,它只需要取nextval并执行更新/插入操作。 - reedstrm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接