最初に、ステータス列は、テーブル内のレコード(行)で表される実際のアイテムのステータスを反映するものではないことを明確にする必要があります。むしろ、レコード自体のステータスを表示することを目的としています。
これは、アクティブ/非アクティブとして、単純なようであるかのように複雑なことができます承認/削除された/ロック/保留/拒否などのステータスがマッピングで、ブール/短整数の列または単一文字列に保存することができるようにtrue
/ 1
=アクティブまたはA
=承認済み。
基本的な考え方は、アプリケーションでごみ箱/ゴミのような回復をサポートすることです(データベースでシミュレートします)。ユーザーがレコードを「削除」できると思われるフロントエンドGUIまたはその他のインターフェイスがある場合、テーブル内のレコードは実際には削除されず、単にレコードのステータスが非アクティブまたは削除済みに変更されます。インターフェイスがレコードをフェッチするとき、ステータスがアクティブまたは承認済みであるという条件にのみ一致するレコードを常に取得します。
ユーザーがミスを犯し、「ユーザーの観点から」「削除された」レコードを回復する必要がある場合、DBAはレコードを簡単に修正してアクティブまたは承認済みに戻すことができます。そこ。または、インターフェイス自体で、ユーザーが削除されたレコードを別のビューで表示し、必要に応じてそれらを復元したり、完全に削除したりすることもできます(実際のレコードを削除します)。
私の質問:
- これは良い習慣ですか、それとも悪い習慣ですか?
- データの正規化に影響しますか?
- 潜在的な落とし穴は何ですか?
- 同じ目標を達成する代替方法はありますか?(ノートを参照してください)
- 特定のステータスのデータに対してのみデータベースに一意の制約を適用するにはどうすればよいですか(ただし、他のステータスの重複をいくつでも許可します)。
- データベースがネイティブで「ごみ箱」のような機能やテーブルトラッキング/リカバリを提供しないので、心配せずにインターフェイスで実際のレコードを削除できます。
注:別の履歴テーブルを維持することについて読みましたが、ストレージの観点からは悪く、トリガーを生成し、追跡テーブルのスキーマでトリガーを最新に保つ必要があるようです。