「DeletedDate」などの列が含まれるテーブル行を表示するのに慣れていて、それらが好きではありません。「削除済み」の概念は、そもそもエントリを作成すべきではないということです。実際には、それらをデータベースから削除することはできませんが、ホットデータでそれらを使用したくありません。論理的に削除された行は、誰かが削除されたデータを見たい場合を除き、定義上、コールドデータです。
さらに、作成されるすべてのクエリはそれらを特に除外する必要があり、インデックスもそれらを考慮する必要があります。
私が見たいのは、データベースアーキテクチャレベルとアプリケーションレベルでの変更です。「削除済み」というスキーマを作成します。各ユーザー定義テーブルには、「削除された」スキーマと同じものがあり、メタデータを保持する追加のフィールドがあります。これは、テーブルをいつ削除したかです。外部キーを作成する必要があります。
次に、削除は挿入と削除になります。最初に、削除される行が、対応する「削除された」スキーマに挿入されます。その後、メインテーブル内の問題の行を削除できます。ただし、線に沿ったどこかに追加のロジックを追加する必要があります。外部キー違反は処理できます。
外部キーは適切に処理する必要があります。行を論理的に削除するのは悪い習慣ですが、そのプライマリ/ユニークな行には、それを参照する他のテーブルの列があります。とにかくこれは起こらないはずです。通常のジョブでは、未亡人の行(外部キーが存在するにもかかわらず、主キーが他のテーブルに参照を持たない行。これはビジネスロジックです)を削除できます。
全体的な利点は、テーブル内のメタデータが削減され、パフォーマンスが向上することです。「deletedDate」列は、この行が実際にここにあるべきではないことを示していますが、便宜上、そこに残して、SQLクエリに処理させます。削除された行のコピーが「削除された」スキーマに保持されている場合、ホットデータを含むメインテーブルは、ホットデータの割合が高く(タイムリーにアーカイブされていると仮定)、不要なメタデータ列が少なくなります。インデックスとクエリでは、このフィールドを考慮する必要がなくなりました。行サイズが短いほど、ページにより多くの行を収めることができ、SQL Serverの動作が速くなります。
主な欠点は、操作のサイズです。現在、1つではなく2つの操作と、追加のロジックとエラー処理があります。そうしないと、単一の列を更新するよりも多くのロックが発生する可能性があります。トランザクションはテーブルのロックをより長く保持し、2つのテーブルが関係します。少なくとも私の経験では、実稼働データを削除することはめったに行われません。それでも、メインテーブルの1つでは、ほぼ1億のエントリの7.5%に「DeletedDate」列のエントリがあります。
質問への回答として、アプリケーションは「削除取り消し」に注意する必要があります。単に逆の順序で同じことを行う必要があります。「削除済み」スキーマからメインテーブルに行を挿入し、「削除済みスキーマ」から行を削除します。ここでも、エラー、外部キーの問題などを回避するために、いくつかの追加のロジックとエラー処理が必要です。