これは、私の他の投稿の 1 つで heximal によって提起されたコメントのフォローアップです。deleted_on
この列が冗長であることを 16 進数が示唆する削除されたレコードを検出するための列が必要です。
彼のコメントは次のとおりです。
フィールドを使用
deleted_xx
して、レコードが削除されたことを判断しますか?私見、最良かつ最も良い方法は、ブールデータ型のアクティビティ属性を記録するために追加することです(たとえば、という名前のフィールド
ACTIVE
)。したがって、レコードを「削除」するには、単一の UPDATE クエリでACTIVE
フィールド との値を更新する必要があります。すべてのアクティブなレコードを選択するには、次のようなクエリを作成する必要があります。update_date
updated_by
SELECT * FROM MyTable WHERE ACTIVE=1
私は、Oracle Applications がそのようなアプローチを使用していることを知っており、同意します。
次の投稿も読みました。
- 削除された行をテーブルに格納する
- http://www.udidahan.com/2009/09/01/dont-delete-just-dont/
- http://ayende.com/Blog/archive/2009/08/30/avoid-soft-deletes.aspx
私の質問は:上記の 16 進数で提案されているように、 isActiveフラグを持つテーブルに一意の制約を設定する方法です。すべてのテーブルに代理キーがあります。ただし、自然キー列 (ビジネス キー列と呼ばれるもの) に一意の制約があることを確認したいと考えています。
deleted_on
削除を追跡するフィールドがある場合は、この列を自然キー制約の一部として含めることができます。したがって、deleted_on 日付フィールドのみが異なる、同じビジネス キーの組み合わせを持つ複数の削除済みレコードが許可されます。
isActive
フィールドがありlast_updated_on
、削除日を追跡するために列を使用する場合、自然キー制約に関する2つのオプションが必要です
isActive
自然キー制約の一部として含めることができます。ただし、これにより、同じビジネス キーの組み合わせを持つ最大 1 つの削除済みレコードのみが許可されます。- 自然キー制約の一部として
isActive
プラスを含めることができます。last_updated_on
しかし、deleted_on 列を追加すると簡単になります。
何かご意見は?ここで何か不足していますか?