あなたが直面している問題は、ご存じのとおり、データベースの正規化の結果です。これを解決するためのアプローチの 1 つは、ビジネス インテリジェンス技術から得られるもので、データ ウェアハウスにデータを非正規化状態でアーカイブすることです。
正規化されたデータ:
- 注文表
- 顧客テーブル
- 品目表
- OrderDetail テーブル
- ItemDetailId
- オーダーID
- アイテム ID
- 品目数量
- 等
クエリを実行して非正規化して保存すると、データ ウェアハウス テーブルは次のようになります。
- オーダーID
- 顧客ID
- 顧客名
- 顧客住所
- (その他の顧客分野)
- ItemDetailId
- アイテム ID
- 項目名
- 商品価格
- (その他の OrderDetail および Item フィールド)
通常、定期的に正規化されたデータからデータ ウェアハウスにデータをプルする何らかのスケジュールされたジョブが存在するか、設計が許す場合は、注文が特定のステータスに達したときに実行できます。(発送済みなど) ステータスが変化するたびに (現在のステータスを追跡する OrderStatus というフィールドを使用して) レコードが保存される可能性があるため、完全に非正規化されたデータを注文/フルフィルメント プロセスの各ステップで使用できます。データをウェアハウスにアーカイブする時期と方法は、ニーズによって異なります。
上記には多くのオーバーヘッドが伴いますが、私が知っているもう 1 つの一般的なアプローチでは、さらに多くのオーバーヘッドが発生します。
もう 1 つの方法は、テーブルを読み取り専用にすることです。顧客が住所を変更したい場合、既存の住所を編集するのではなく、新しいレコードを挿入します。
したがって、Jamnuary であなたのサイトで最初に注文したときに私の住所が AddressId 12 だった場合、7 月 4 日に移動すると、アカウントに関連付けられた新しい AddressId が取得されます。(あなたのサイトは非常に成功しており、多くの顧客を引き付けているため、AddressId 123123 とします。)
7 月 4 日より前に行った注文には AddressId 12 が関連付けられ、7 月 4 日以降に行われた注文には AddressId 123123 が関連付けられます。
履歴データを保持する必要があるすべてのテーブルで、このパターンを繰り返します。
私は 3 番目のアプローチを持っていますが、それを探すのは困難です。私はこれを 1 つのアプリでのみ使用していますが、実際には、特定の時点でのデータを正確に再構築するという非常に具体的なビジネス ニーズがあったこの 1 つのインスタンスでかなりうまく機能します。同様のビジネスニーズがない限り、私はそれを使用しません。
特定の状態で、データを Xml ドキュメント、またはデータの再構築に使用できるその他のドキュメントにシリアル化します。これにより、シリアル化された時点のデータを保存し、元のテーブル構造と関係を保持できます。