2017-01-20 7 views
0

私のアプリケーションはオンラインストアの顧客にサービスを提供します。私のDBのテーブルの1つは「Product」で、列には「In_Stock」があります。これはブール値(ビット(1))の列です。私の顧客は製品カタログのデータフィードを送信し、各顧客はこの表の独自のバージョンを持っています。私はいくつかの監査を行うときに、私はの状態だったもの一定の期間のために見ることができるだけように私は、株式欄ではこれに変更を追跡するためにMySQLデータベースのブール値列の変更を追跡する方法は?

11/13/2016 true 
12/26/2016 false 
01/07/2017 true 

...の効果に何かをしたいと思います所定の製品。

どのようにすればよいですか?

個別の履歴テーブルを作成し、1つのブール型列のトリガだけで更新するのは難しいようです。歴史欄で十分でしょうか?何らかのJSON文字列にデータを保存することができます。

+0

「監査」または「監査証跡」をSOで検索します。または、右の列を見てください。 – DanMan

+0

「履歴」と「現在の状態」は、2つの別々の表として行うのが最も適しています。 –

答えて

0

私はトリガをするでしょう。しかし、列全体を複製しないでください - 一意の列ID、ログのタイムスタンプとブール値を取る。 時には良いログを持つことは大変貴重です。

1

申し訳ありませんが、実行可能な解決策には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は、バージョン管理されたデータの現在および過去の値を取得するためのクエリを含む以前の回答です。私はこのデザインについて何度もここで議論しました。

また、アプリケーションコードを変更する必要がないように設計を構成する方法もあります。つまり、再設計は既存のコードに対して完全に透過的になります。上にリンクされている回答には、それがどのように行われているかを示すための別のドキュメントへのリンクがあります。

0

私はこの目的のためにaudit trail moduleを書いています。基本的にはテーブルを複製し、各行に情報を追加し、元のデータテーブルはトリガー以外のままにしておきます。

関連する問題