DBテーブルレコードを完全に削除するのではなく、削除済みとしてマークしたい場合がありますか?
どうやってそれをしますか?
これまでブール値の「削除済み」フィールドを使用してきましたが、それが適切なアプローチかどうかはわかりません。
DBテーブルレコードを完全に削除するのではなく、削除済みとしてマークしたい場合がありますか?
どうやってそれをしますか?
これまでブール値の「削除済み」フィールドを使用してきましたが、それが適切なアプローチかどうかはわかりません。
これで、レコードが削除されたことを示すブールフィールドが表示されます。それを数回使用して、そのフィールドを呼び出しましたIsDeleted
。
これは、論理削除と呼ばれることがよくあります。
レポートでそのフィールドを尊重するのはあなた次第です。つまり、。を含むすべてのレコードを除外することを意味しますIsDeleted = true
。テーブルとリレーションがたくさんある場合、これらのクエリは少し複雑になる可能性があります。
また、テーブルに固有の制約がある場合、いくつかの問題が発生する可能性があります。たとえば、ユーザーテーブルでユーザーが持っていIsDeleted = true
て、電子メール列が一意である場合、同じ電子メールアドレスを持つ新しいユーザーを追加することはできません。
これらのフィールドを考慮に入れるORMがいくつかあります。たとえば、SubSonic 2.2は、「Deleted」または「IsDeleted」という名前の列がある場合、レコードを削除せず、代わりにこのフィールドをtrueに設定します。
いくつかの関連リソース:
これの代わりに、監査テーブルを追加することもできます。
私は通常IsDeletedを使用します。
複数の状態(通常、アーカイブ、削除など)がある場合、状態を表すために列挙型(または使用できない場合はInt)を使用する場合があります。この場合、通常、フィールドにStatusまたはStateという名前を付けます。
私はそれが大丈夫な解決策だと思います。別のアプローチは、データを別のテーブル、ある種の履歴テーブルに移動することです。これにより、アクティブなデータを含むテーブル内のデータをより高速に検索できます。しかし、それはあなたの状況に依存します。
銀行業界では、すべての変更(削除だけでなく)を保存することをお勧めします。通常、これは元のDDLとほぼ同じDDLに加えて、操作タイプ、日付と時刻、ユーザーなどを示すいくつかのフラグを使用して「ログテーブル」で実行されます。ただし、(非常に重要ですが)ログテーブルは一意のキーなしで定義されます。
私はdatetimeを使用し、生きている場合はnull、「deletedon」にはtimstampを使用します。
に最適です
if(timestamp) {}
デフォルトはnullだからです。