【问题标题】:MongoDB Capped collection equivalent in PostgreSQLPostgreSQL 中的 MongoDB Capped 集合等价物
【发布时间】:2012-06-05 11:43:25
【问题描述】:

MongoDB capped collections 的基本原理是它们允许您设置表的最大大小,当达到大小限制时系统将清除旧数据。

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

【问题讨论】:

  • 实施分区并以编程方式删除较旧的分区并仅保留最新的分区可能有效。从理论上讲,它应该比从表中删除行更好。

标签: postgresql mongodb database-replication


【解决方案1】:

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

首先,让我们创建表。我们将有一个 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 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/

【讨论】:

    【解决方案2】:

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

    特别有趣(在我看来)是牛的反应(即看不被接受的答案)。

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

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

    【讨论】:

    • 其实就是让序列有一个最大集合大小的CYCLE值。这使您可以使用只接受 nextval 并执行更新/插入操作的 upsert 触发器。
    猜你喜欢
    • 1970-01-01
    • 2018-01-31
    • 2012-05-18
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多