申し訳ありませんが、実行可能な解決策には2番目のテーブルが必要です。
このような解決策の1つは、バージョンノーマルフォーム(vnf)です(これは2nfの特殊なケースです)。 booleanフィールドを含むテーブルを考えてください(少なくとも3nfに正規化されていると仮定して)。これでブール値フィールドに加えられた変更を追跡します。 1つの方法は、EffectiveDate列を追加して行をバージョンに変換し、行を更新する代わりに、日付フィールドに現在の日付を含む新しい行を書き込むか、またはブール値フィールドが変更されていない場合に更新することです。
これにより、フィールドの追跡が可能になり、フィールドが変更されるたびに新しいバージョンが追加されます。しかし、重大な欠点があります。行はもはやエンティティではなく、エンティティのバージョンであるという事実だけではありません。これにより、エンティティを参照したい外部キーをこのテーブルに使用することは不可能です。
しかし、デザインを慎重に見てください。変更の前に、変更の追跡を行わない正常な正規化されたテーブルがありました。 EffectiveDate列を追加した後、微妙な変更がありました。ブール値フィールドを除くすべてのフィールドは、以前のようにPKのみに依存します。ブール値フィールドは、PKだけでなく新しい日付フィールドにも依存しています。もはや2nfではない。
テーブルを正規化すると、新しいテーブルにブールフィールドと日付フィールドを移動する必要があります。
create table NewTable(
EntityID int not null references OriginalTable(ID),
EffDate date not null,
TrackedCol boolean,
constraint PK_NewTable primary key(EntityID, EffDate)
);
最初のバージョンは、新しい行が元のテーブルに挿入されたときに挿入されます。その後、元のテーブルの更新によってブール値フィールドの値が変更された場合にのみ、別のバージョンが追加されます。
Hereは、バージョン管理されたデータの現在および過去の値を取得するためのクエリを含む以前の回答です。私はこのデザインについて何度もここで議論しました。
また、アプリケーションコードを変更する必要がないように設計を構成する方法もあります。つまり、再設計は既存のコードに対して完全に透過的になります。上にリンクされている回答には、それがどのように行われているかを示すための別のドキュメントへのリンクがあります。
「監査」または「監査証跡」をSOで検索します。または、右の列を見てください。 – DanMan
「履歴」と「現在の状態」は、2つの別々の表として行うのが最も適しています。 –