3

これは、私の他の投稿の 1 つで heximal によって提起されたコメントのフォローアップです。deleted_onこの列が冗長であることを 16 進数が示唆する削除されたレコードを検出するための列が必要です。

彼のコメントは次のとおりです。

フィールドを使用deleted_xxして、レコードが削除されたことを判断しますか?

私見、最良かつ最も良い方法は、ブールデータ型のアクティビティ属性を記録するために追加することです(たとえば、という名前のフィールドACTIVE)。したがって、レコードを「削除」するには、単一の UPDATE クエリでACTIVEフィールド との値を更新する必要があります。すべてのアクティブなレコードを選択するには、次のようなクエリを作成する必要があります。update_dateupdated_by

SELECT * FROM MyTable WHERE ACTIVE=1

私は、Oracle Applications がそのようなアプローチを使用していることを知っており、同意します。

次の投稿も読みました。

私の質問は:上記の 16 進数で提案されているように、 isActiveフラグを持つテーブルに一意の制約を設定する方法です。すべてのテーブルに代理キーがあります。ただし、自然キー列 (ビジネス キー列と呼ばれるもの) に一意の制約があることを確認したいと考えています。

deleted_on削除を追跡するフィールドがある場合は、この列を自然キー制約の一部として含めることができます。したがって、deleted_on 日付フィールドのみが異なる、同じビジネス キーの組み合わせを持つ複数の削除済みレコードが許可されます。

isActiveフィールドがありlast_updated_on、削除日を追跡するために列を使用する場合、自然キー制約に関する2つのオプションが必要です

  1. isActive自然キー制約の一部として含めることができます。ただし、これにより、同じビジネス キーの組み合わせを持つ最大 1 つの削除済みレコードのみが許可されます。
  2. 自然キー制約の一部としてisActiveプラスを含めることができます。last_updated_onしかし、deleted_on 列を追加すると簡単になります。

何かご意見は?ここで何か不足していますか?

4

3 に答える 3

1

「私の質問は、上記の heximal で提案されているように、isActive フラグを持つテーブルに一意の制約を設定する方法です。すべてのテーブルに代理キーがあります。しかし、自然キー列 (ビジネス キー列と呼ばれるもの) を確保したいです。 ) 一意の制約があります。

削除を追跡する deleted_on フィールドがある場合、この列を自然キー制約の一部として含めることができます。したがって、deleted_on 日付フィールドのみが異なる、同じビジネス キーの組み合わせを持つ複数の削除済みレコードが許可されます。」

ナチュラル キーの一部として deleted_on DATE フィールドを使用しても、同じ日にすべてを削除、再挿入、削除することはできませんでした。病的なように見えるかもしれませんが、病的なケースが決して起こらないと本当に確信できますか?

現在のビジネスに関連性が高いという意味で「アクティブ」なコンテンツがあり、他のコンテンツが「非アクティブ」であるという事実をデータベースに反映する必要がある場合。時間はアーカイブの目的のためであり、2 つのテーブルを定義することによってその事実を反映するようにデータベースを設計します。おそらく、トリガーを使用して、削除が発生するたびに「アーカイブへの移動」を自動的に実現できます。

そうすることで、「アクティブな」テーブルで一意の制約を使用して DBMS によって自然キーを強制することができ、「アーカイブ」テーブルに削除タイムスタンプを含めることができます。すべてそのテーブルにあります。

于 2011-04-19T11:51:41.247 に答える
0

すでに書いたことを思い出したとき、私は大きなエッセイを書き込もうとしていました
。EAVテーブルを使用したこの「ソフト削除」ソリューションに問題はありますか?
削除を元に戻す簡単な方法、または監査/トラブルシューティングの目的で削除の実績を保持することが必要な場合は、ミラーテーブルを使用するのが簡単な解決策です。

および ソフト削除のベストプラクティス(PHP / MySQL)
「削除」が実際に何を意味するかを考える必要があります。履歴を再構築できるようにしたいようです。その場合、「削除」という用語は混乱を招きます。それは本当に削除ではありません。代わりに、ある種の時間データモデルを使用して、発効日の概念を導入したいと考えています。

または、データ量のみを気にする場合は、X日/年より古い行を削除または移動する単純なバッチプロセスも非常に簡単な方法です。

于 2011-04-19T19:08:19.480 に答える
0

ACTIVE 列の代わりに "VERSION" (整数) を追加するのはどうですか?

  • 現在の (アクティブで、削除されていない) バージョンは 0 です
  • 現在のバージョンを新しいバージョンに置き換えるたびに、VERSION を VERSION-1 に置き換えて既存のすべての行を UPDATE し (現在のバージョンは -1 になり、以前の現在のバージョンは -2 になるなど)、新しい現在のレコードを VERSION=0 で INSERT します。 .

もちろん、このバージョン フィールドは簡単にナチュラル キーの一部にすることができます。

于 2011-04-19T08:49:20.927 に答える