トランザクションは、処理後に変更しないでください。
支払人の詳細は時間の経過とともに変化する可能性があります。
変更をどのように追跡しますか?
TRANSACTION
Id(PK)
PayerId(FK)
...
PAYER
Id(PK)
...
...
トランザクションは、処理後に変更しないでください。
支払人の詳細は時間の経過とともに変化する可能性があります。
変更をどのように追跡しますか?
TRANSACTION
Id(PK)
PayerId(FK)
...
PAYER
Id(PK)
...
...
これを行うにはいくつかの方法があります。
変更時に詳細を別のテーブルにコピーしてはどうでしょうか。これを記録すると、その日付より前のトランザクションにこの情報を使用することがわかります。
または、このすべてのデータをレポート用のテーブルに非正規化することもできます。
または、顧客の詳細にリンクする新しいテーブルはどうですか。これが更新されると、新しい行にリンクされ、その行で前の行にリンクされます。そのようにして(ゆっくりと)データを抽出できるようになります。
私たちの最善の策は、2つのことのいずれかを行うことです。トランザクション時のデータをTRANSACTIONテーブルまたはTRANSACTIONDETAILSテーブルに保存します。これは非正規化ではありません。発生した時点のデータが必要であり、PAYERテーブルへの結合をそのままにしておくと、時間の経過とともに変化するため、データが正しくなくなります。データが複数のレコードで繰り返されるという事実は、CAが状態フィールドのあるアドレステーブルに複数回表示されるよりも重要ではありません。必要に応じて現在のデータを検索できるように、PAYERIDも保存する必要があります。これが最も簡単なソリューションです。
別の解決策は、時間に基づいてデータを検索する方法を追加することです。これはより複雑であり、非常に注意深く行う必要があります。そうしないと、データの整合性が失われたり、非常に安定したレポート結果が得られたりします。支払人に関連するテーブルがある場合は、私が見つけるのが最善です。最初にPAYORを設定します。これには、基本的に時間ベースのデータを持つPAYORIDとPAYORDETAILSが含まれます。このようにして、外部キー制約をPAYORに適用できますが(必要に応じて現在の詳細を検索できます)、アドレスや名前などの変更が発生した場合でも、PAYORDETAILSテーブルに複数のレコードを格納できます。また、これらの各レコードの開始日と終了日、および開始日と終了日が重複しないようにトリガーする必要があります。たとえば、複数の住所がある場合、それぞれに一度にアクティブにできるアドレスタイプが必要であるため、さらに複雑になります(3つの住所に製品を出荷したことをレポートに表示したくない場合)。すべてのクエリで開始日と終了日を確認する必要があります。通常は、常に現在のレコードのみを表示するビューを設定するのが最適です。このシナリオは、設定と保守が時間の経過とともにはるかに複雑になり、トランザクションに適切なデータが添付されない原因となる可能性のあるバグが発生する可能性がはるかに高くなります。
トリガーを使用して、変更を追跡できます。変更の履歴を新しいテーブルに保存します。
トリガーの重要性は、テーブルレコードに変更が発生した場合はいつでも、行われた変更の履歴を作成できることです。
Inserted
更新されたデータについては、テーブルからレコードを選択できます
Deleted
廃止されたデータについては、テーブルからレコードを選択できます
新しいテーブルを作成するときは、このテーブルで外部キーを使用しないようにすることができます。このテーブルにデータを直接保存すると、履歴データを取得する際にクエリを高速に保つのに役立ちます
Payerエンティティで「時間」をファーストクラスの概念にすることを強くお勧めします。Damien_the_unbelieverの「テンポラルテーブル」ソリューションはこれを実現しますが、代替の実装があります。
これまで、支払人テーブルに有効期間ウィンドウを追加し、取引日をそのウィンドウと比較することで、このような問題を解決しました。
TRANSACTION
Id(PK)
PayerId
TransactionDate
...
PAYER
Id
ValidFrom
ValidUntil
....
このスキーマを使用すると、トランザクション時の支払人を見つけることができます。これは、参照整合性に依存できないことを意味します(PayerテーブルのIDは有効な主キーではないため、同じIDを持つ複数のレコードがあります。
そのひねりは次のようになります:
TRANSACTION
Id(PK)
PayerId(FK)
...
PAYER
Id(PK)
PAYER_DETAIL
ID(FK)
PayerID (FK)
ValidFrom
ValidUntil
.....