3

このトピックに関する同様の 質問がいくつかありますが、実際には役に立ちません。

アイテムが実際には削除されずに隠されている、StackOverflow のようなソフト削除機能を実装したいと考えています。SQL データベースを使用しています。3 つのオプションがあります。

  • is_deletedブールフィールドを追加します。

    • 利点: シンプル。
    • 短所:日付記録がない。is_deleted = 0すべてのクエリに a を追加する必要があります。
  • deleted_date日付フィールドを追加します。これはNULL、削除されていない場合に設定されます。

    • メリット:日付あり。
    • 短所: まだクエリが雑然としています。

上記の両方について

  • これらの無駄な行がすべてあるため、パフォーマンスにも影響します。それらは引き続きインデックスで維持する必要があります。deletedまた、削除されていない (大部分の) 行をフェッチする場合、列のインデックスは役に立ちません。全表スキャンが必要です。

もう 1 つのオプションは、削除されたアイテムを保持する別のテーブルを作成することです。

  • 利点: 削除されていない行をクエリするときのパフォーマンスが向上します。削除されていない行に対するクエリに条件を追加する必要はありません。インデックスのメンテナンスが容易になります。
  • 短所: 複雑さ: 削除と復元の両方にデータ移行が必要です。新しいテーブルが必要です。参照整合性は扱いが難しくなります。

より良いオプションはありますか?

4

5 に答える 5

3

個人的には、ユーザーが削除されたデータにアクセスしたり、削除されたデータを「復元」したりする頻度に基づいて答えを出します。

よくある場合は、「Date_Deleted」フィールドを使用し、計算された「IsDeleted」をコードの poco に入れます。

まったくない (またはほとんどない) 場合は、履歴テーブルまたは削除されたテーブルが、説明した利点に適しています。

参照整合性に対する潜在的なリスクがあるため、個人的には、削除されたテーブルを使用することはほとんどありません (そして isDeleted または date_deleted を選択します)。A -> B があり、B データベースからレコードを削除します... 設計上の選択により、参照整合性を管理する必要があります。

于 2011-09-09T20:08:02.467 に答える
2

オプションの分析は良いと思いますが、以下にリストするいくつかの関連するポイントを見逃していました. 最初の2つのオプションで提案したように、私が見たほとんどすべての実装は、行に何らかの削除またはバージョン管理フィールドを使用しています。

削除済みフラグを持つ 1 つのテーブルの使用: すべてのインデックスに最初に削除済みフラグ フィールドが含まれ、クエリのほとんどに where isdeleted=false 型構造が含まれている場合、パフォーマンスの問題は解決され、インデックスは削除された行を非常に効率的に除外します。同様のロジックは、削除日オプションにも使用できます。

2 つのテーブルの使用 通常、一部のレポートは削除されたデータを参照する可能性があるため (古い売上高が削除された売上カテゴリを参照する場合など)、レポートに大幅な変更を加える必要があります。これを克服するには、2 つのテーブルを結合したビューを作成して、アクティブなレコード テーブルにのみ書き込みます。

于 2016-05-16T12:25:32.597 に答える
2

私の意見では、スケーリングと最終的なテーブル/データベースのサイズを考えるときの最善の方法は、削除されたアイテム用の別のテーブルである 3 番目のオプションです。このようなテーブルは、スケーリングをサポートするために、最終的に別のデータベースに移動できます。

最も一般的な 3 つのオプションをリストしたと思います。見てきたように、それぞれに長所と短所があります。個人的には、物事を長い目で見るのが好きです。

于 2011-09-09T20:06:40.227 に答える
2

キーが数値の場合、キーを無効にすることで「ソフト削除」を処理します。(もちろん、ID キーでは機能しません)。コードをまったく変更する必要はなく、-1 を掛けることで簡単にレコードを復元できます。

考えてみるためのもう1つのアプローチ...キーが英数字の場合、一意の「マーカー」文字を先頭に追加することで同様のことができます。削除されたレコードはすべてこのマーカーで始まるため、インデックス内で単独で終了します。

于 2011-09-09T20:14:03.753 に答える