9

MongoDBの上限付きコレクションの非常に基本的な点は、テーブルの最大サイズを設定できることです。サイズ制限に達すると、システムは古いデータをクリアします。

誰かがPostgreSQLで同様のセットアップを思いつき、それを本番環境で使用したことがありますか?

4

2 に答える 2

10

これは、データのサイズが大きすぎず、パフォーマンス要件が厳しすぎない場合の簡単な解決策です。

まず、テーブルを作成しましょう。id 列と data 列を用意しますが、特定の状況に必要な任意の列を使用できます。

CREATE TABLE capped_collection (
  id integer NOT NULL,
  data text);

ここで、主キーのシーケンスを作成し、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;

MAXVALUE次のステップ (ここには示されていません) では、テーブルにレコードを事前にシードする必要があります。これは、すべての id 値に行が含まれるようにするためです。INSERT 操作と UPDATE 操作のどちらを実行するかを決めることを心配する必要はありません。単純でパフォーマンスを維持するためです。

テーブルが設定されたので、新しい行を INSERT したいときはいつでも、代わりにそのように UPDATE を行います

UPDATE capped_collection
SET data = 'your data here'
WHERE id = (SELECT nextval('capped_collection_id_seq'))

このnextvalコマンドは次の ID を取得します。指定CYCLEしたため、 に到達すると 1 に戻りますMAXVALUE。最終的には、テーブルに行だけがMAXVALUE残り、最も古いエントリが期限切れになります。

( http://www.rigelgroupllc.com/blog/2014/10/14/capped-collections-in-postgres/より)

于 2014-11-03T21:26:07.153 に答える
6

そのようなことは聞いたことがありません。以下を使用して、上限のあるテーブルサイズまたは循環キューをシミュレートできると思います。

(私の観点から) 特に興味深いのは、ウシの応答です (つまり、受け入れられていない回答を見てください)。

「コレクション」へのインデックスと列のシーケンスを表すテーブルへの列の導入により、各 upsert は条件に基づくことができます。

where index = (sequence.nextval % max collection size)
于 2012-07-10T15:14:02.827 に答える