完全に正規化されたテーブルを非正規化する方法について誰かアドバイスできますか? グーグルで検索してもあまり見つかりませんでした。
TableA でレコードが更新されるたびに (挿入されていませんが、今は気にする必要はありません)、変更されたフィールドの値と、それが実行されたときに関連付けられたタイムスタンプと共にレコードが HistoryOfTableA に挿入されます。
例えば。
テーブル A フィールド:
TableA_Id, FieldA, FieldB, FieldC, FieldD.... etc
HistoryOfTableA レコード:
HistID, TableA_Id, FieldChanged, OldValue, NewValue, DateCreated
1, 1, 'FieldA', 1, 2, <2013-03-18 12:20:00>
2, 1, 'FieldB', A, B, <2013-03-18 12:20:00>
3, 1, 'FieldC', A, B, <2013-03-18 12:20:00>
状況は、レポート目的でいくつかの SQL を作成しようとしています。したがって、特定の時点を指定して、それらの敵対的なテーブル エントリをまとめて、その時点での TableA のレコードの状態を把握できるようにしたいと考えています。
履歴テーブルに基づいてテーブルを作成し、作成日とテーブル A の ID を結合できると考えています
例えば。
select HistA.NewValue,
HistB.NewValue,
....
from FieldA_HistoryOfTableA HistA
inner join FieldB_HistoryOfTableA HistB on HistA.DateCreated = HistB.DateCreated
and HistA.TableA_Id = HistB.TableA_Id
inner join ... etc
where HistA.FieldChanged = 'FieldA'
and HistB.FieldChanged = 'FieldB'
and .... etc...
しかし、これで私が望むすべてが得られるとは思いませんし、純粋に SQL でこれを行うことはできないかもしれません。余談ですが、TableA には 20 個のフィールドがあるため、20 個のテーブルを結合しようとするのは賢明ではないかもしれません。