私は、postgres データベースから行を削除する代わりに、行を非表示にして、行が誤って削除された場合でもそれらを取得できるようにすることにしました。データベースから行を非表示にする最善の方法は何ですか? 「アクティブ」という名前の列を作成し、1 または 0 の値を指定することをお勧めしますか。1 はアクティブを意味し、0 は削除および非表示を意味します。それが重要な場合は、sqlalchemy も使用しています。
4 に答える
実際のテーブルを非表示にし、ビューを作成し、ルールを使用して挿入、更新、および削除を行うことができます。
セッションテーブルがあるとします。すべてのデータと「アクティブ」列を含む、sessions_table というテーブルを作成します。次に、Greg が述べたように、session (CREATE view sessions AS SELECT [all fields without active] FROM sessions_table WHERE active = TRUE) というビューがあります。
これでルールを作成できます: セッションで行を削除したい場合は、代わりに sessions_table で行を更新します:
CREATE RULE delete_session ON DELETE TO sessions DO INSTEAD UPDATE sessions_table SET active = FALSE WHERE id = OLD.id;
挿入するには、次のものが必要です。
CREATE RULE insert_session ON INSERT TO sessions DO INSTEAD INSERT INTO sessions_table (..., active) VALUES(..., TRUE);
そして最後に
CREATE RULE update_session ON UPDATE TO session DO INSTEAD UPDATE sessions_table SET ... WHERE id = new.id AND active = TRUE;
これで、セッションで作業を完全に呼び出すことができ、アクティブな列を気にする必要がなくなりました。
フラグよりも「ValidBefore」タイムスタンプを持つ方がはるかに優れています。
おそらく、それらを保存したい理由は、削除ロジックやユーザーを信頼していないためであり、エラーが発見されたときに削除された行を回復できるようにしたいからです。
これは、単なるフラグではなく、タイムスタンプなどがある場合にはるかに簡単です。
実際に行を削除せずにそれを行う唯一の方法です。
アクティブなエントリのみを表示するビューを作成できるため、すべてのクエリの where 句にそれを追加することを覚えておく必要はありません。
アクティブなテーブルとまったく同じ構造を持つhidden_rows_tableを作成するのはどうですか?次に、行を削除するときに、アクティブなテーブルからhidden_rows_tableに行を移動できます。すべての行(非表示とアクティブの両方)を選択するには、UNIONを使用できます。
このソリューションは、データウェアハウスのように大量のデータがあり、たとえば新しいインデックスの作成のパフォーマンスが心配な場合に特に適しています。