3

DBテーブルレコードを完全に削除するのではなく、削除済みとしてマークしたい場合がありますか?

どうやってそれをしますか?

これまでブール値の「削除済み」フィールドを使用してきましたが、それが適切なアプローチかどうかはわかりません。

4

5 に答える 5

7

これで、レコードが削除されたことを示すブールフィールドが表示されます。それを数回使用して、そのフィールドを呼び出しましたIsDeleted

これは、論理削除と呼ばれることがよくあります。

レポートでそのフィールドを尊重するのはあなた次第です。つまり、。を含むすべてのレコードを除外することを意味しますIsDeleted = true。テーブルとリレーションがたくさんある場合、これらのクエリは少し複雑になる可能性があります。

また、テーブルに固有の制約がある場合、いくつかの問題が発生する可能性があります。たとえば、ユーザーテーブルでユーザーが持っていIsDeleted = trueて、電子メール列が一意である場合、同じ電子メールアドレスを持つ新しいユーザーを追加することはできません。

これらのフィールドを考慮に入れるORMがいくつかあります。たとえば、SubSonic 2.2は、「Deleted」または「IsDeleted」という名前の列がある場合、レコードを削除せず、代わりにこのフィールドをtrueに設定します。

いくつかの関連リソース:

これの代わりに、監査テーブルを追加することもできます。

于 2010-05-30T10:57:44.253 に答える
2

私は通常IsDeletedを使用します。

複数の状態(通常、アーカイブ、削除など)がある場合、状態を表すために列挙型(または使用できない場合はInt)を使用する場合があります。この場合、通常、フィールドにStatusまたはStateという名前を付けます。

于 2010-05-30T10:55:07.553 に答える
1

私はそれが大丈夫な解決策だと思います。別のアプローチは、データを別のテーブル、ある種の履歴テーブルに移動することです。これにより、アクティブなデータを含むテーブル内のデータをより高速に検索できます。しかし、それはあなたの状況に依存します。

于 2010-05-30T10:54:39.080 に答える
1

銀行業界では、すべての変更(削除だけでなく)を保存することをお勧めします。通常、これは元のDDLとほぼ同じDDLに加えて、操作タイプ、日付と時刻、ユーザーなどを示すいくつかのフラグを使用して「ログテーブル」で実行されます。ただし、(非常に重要ですが)ログテーブルは一意のキーなしで定義されます。

于 2010-05-31T20:36:31.647 に答える
1

私はdatetimeを使用し、生きている場合はnull、「deletedon」にはtimstampを使用します。

に最適です

if(timestamp) {}

デフォルトはnullだからです。

于 2010-05-31T20:44:05.990 に答える