2012-06-05 40 views
6

MongoDB集合集合的基礎知識是它們允許您設置表的最大大小,並且在達到大小限制時系統將清除舊數據。MongoDB在PostgreSQL中相當於集合的集合

有沒有人想出了PostgreSQL中的類似設置並將其用於生產?

+1

實現分區和編程丟棄舊的分區,並只保留最近的一個可能的工作。從理論上講,它應該比從表格中刪除行更好。 – Marquez

回答

3

還沒有聽說過這樣的事情。我想你可以通過使用模擬封頂表的大小或圓形隊列:

特別有趣的(從我的角度看)是牛的迴應(即看看未接受的答案)。

通過引入一列的表中表示的索引,「收藏」和該列的序列,每個UPSERT可以基於所述條件:

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

實際上,只是使序列具有最大集合大小的CYCLE值。這可以讓你使用upsert觸發器,它只需要nextval並執行更新/插入操作。 – reedstrm

3

下面是一個簡單的解決方案對此,例如數據量不是很大,性能要求不太苛刻的情況。

首先,我們來創建我們的表。我們將有一個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 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/