2011-07-31 9 views
3

おそらくDBトリガーを使用してpostgres DBに最大テーブルサイズを設定できますか?DB Postgresの最大テーブルサイズを制限するためのトリガー

たとえば、Commentsと呼ばれるテーブルがあります。

ユーザーの観点からすると、これはできるだけ頻繁に行うことができますが、最新の100件のコメントをDBに保存したいとします。だから私がしたいのは、これを自動的に維持するトリガーを持たせることです。私。 100以上のコメントがある場合、最も古いものを削除します。

誰かがこのようなトリガーを書くのを手伝ってもらえますか?

答えて

1

ユーザーあたりのコメント数を100に制限するのは簡単です。

delete from comments where user_id = new.user_id 
order by comment_date desc offset 100; 

バイトサイズを制限するのは難しいです。関連する行サイズを計算する必要があり、インデックスサイズ、デッドローなどを考慮しません。管理機能を使用してテーブルサイズを取得するのがよいでしょうが、ユーザーごとのサイズは得られませんが、総サイズのみ。

+2

PostgreSQLのDELETE節は、ORDER BYをサポートしていません。サブクエリを使用する必要があります。 – doctore

2

私は、トリガーは仕事の間違ったツールだと思います。これを実装することは可能ですが、実行中の挿入物から「削除」を発生させる何かが、首の首の髪を立たせます。あなたは多くのロックを生成し、そのように競合する可能性があります。挿入は一般的にロックを生成しません。

私にはこれは「ストアドプロシージャ」と言います。

しかし、私はまたあなた自身に "なぜ古いコメントを削除するのか"と尋ねるべきだと思いますか?削除は嫌悪感です。あなたがそれらを表示するときにそれらを制限するほうが良い。本当にテーブルのサイズが心配な場合は、TEXT列を使用してください。 Postgresはこれらをシャドーテーブルに保持し、元のテーブルのフルスキャンがうまくいっています。

0

理論上、100個のダミーレコードのテーブルを作成し、実際のコメントで単純に上書きすることができます。

この方法では、テーブルのサイズは同じにしておきますが、これは可能ではありません。これは、Postgresqlのupdate is equivalent to delete,insertです。したがって、テーブルのサイズは拡大し続けます。

したがって、ディスクドライブがオーバーフローしないようにするには、ディスクが80%でいっぱいになったらディスク空き容量を確保するために「真空引き」を実行する必要があります。 「Vacuum full」はディスクスペースを必要とします。レコードを固定数にしておけば、真空の影響があります。また、真空can failがある場合があります。

関連する問題