MongoDB Capped集合在PostgreSQL中等效

Uzb*_*jon 7 postgresql mongodb database-replication

MongoDB上限集合的基础是它们允许您设置表的最大大小,并且系统将在达到大小限制时清除旧数据.

有没有人想出PostgreSQL中的类似设置并在生产中使用它?

小智 9

这是一个简单的解决方案,例如数据大小不太大且性能要求不太苛刻的情况。

首先,让我们创建表。我们将有一个id列和一个data列,但您可以根据自己的特定情况选择所需的任何列。

CREATE TABLE capped_collection (
  id integer NOT NULL,
  data text);
Run Code Online (Sandbox Code Playgroud)

现在,我们为主键创建一个序列,将设置为MAXVALUE上限集合的所需大小,然后使用CYCLE选项,这样该序列将累加至1 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;
Run Code Online (Sandbox Code Playgroud)

在下一步(此处未显示)中,您应在表中预先添加MAXVALUE记录。我们这样做是为了使每个id值都具有一行,并且我们不必担心决定执行INSERT还是UPDATE操作,只是为了使事情简单而高效。

现在我们的表已经设置好了,每当我们要插入新行时,我们都像这样执行UPDATE

UPDATE capped_collection
SET data = 'your data here'
WHERE id = (SELECT nextval('capped_collection_id_seq'))
Run Code Online (Sandbox Code Playgroud)

nextval命令为我们提供了下一个id,因为我们指定了CYCLE它,一旦到达,它将回绕为1 MAXVALUE。最终结果是MAXVALUE,表中将永远只有行,而最旧的条目将被淘汰。

(来自http://www.rigelgroupllc.com/blog/2014/10/14/capped-collections-in-postgres/


Gle*_*enn 5

没听说过那样的话。我猜您可以使用以下方法来模拟上限表大小或循环队列:

从我的角度来看,最有趣的是牛的反应(即查看未接受的答案)。

通过在表中引入一列来表示“集合”的索引和该列的顺序,每个更新都可以基于以下条件:

where index = (sequence.nextval % max collection size)
Run Code Online (Sandbox Code Playgroud)

  • 实际上,只需使序列具有最大集合大小的CYCLE值即可。这使您可以使用仅执行nextval并执行更新/插入操作的upsert触发器。 (4认同)