MongoDB Capped集合在PostgreSQL中等效

时间:2012-06-05 11:43:26

标签: postgresql mongodb database-replication

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

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

2 个答案:

答案 0 :(得分:6)

这是一个简单的解决方案,适用于数据大小不太大且性能要求不太严格的情况。

首先,让我们创建我们的表。我们将有一个id列和一个数据列,但您可以根据具体情况获得所需的列。

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/

答案 1 :(得分:5)

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

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

通过向表中引入一列来表示“集合”的索引和列的序列,每个upsert可以基于条件:

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