私はこのすべてに単一の解決策を認識していません。おそらくそれぞれのプロジェクトが非常に異なるからです。
埋め込みバージョンと妥当性の概念これはに頼ることなく、時間をかけて変化に対応するための方法です
データモデルに:しかし、ここで私は過去に使用した2つの技術があります履歴テーブル。それはあなたのクエリを複雑にするので、あなたは控えめにそれを使うべきです。たとえば、代わりにこのモデルでは
PRODUCTS
Product_ID primary key
Price
Description
AvailableFlag
、あなたが製品を削除したい場合は、あなたが"delete from product where product_id = ..."
を実行し、次のように製品のテーブルを持っていることの
。修正価格はバージョン管理モデルで"update products set price = 1 where product_id = ...."
だろう、あなたが持っている:
PRODUCTS
product_ID primary key
valid_from datetime
valid_until datetime
deleted_flag
Price
Description
AvailableFlag
をこのモデルでは、製品を削除すると、update products set valid_until = getdate() where product_id = xxx and valid_until is null
にあなたを必要とし、「=真deleted_flag」で新しい行を挿入します。
価格の変更も同様です。
これは、「ダーティ」データに対してクエリを実行し、誤ってインポートに失敗したアイテムを削除する心配なしにこのテーブルに挿入できることを意味します。また、時間の経過とともにレコードの進化を確認し、簡単にロールバックすることもできます。
は、累積値、あなたが「在庫品の数」のようなものを持っている
ための台帳のようなメカニズムを使用し、それはあなたからの電流量を取るのではなく、量を変更するためのトランザクションを作成するのに役立ちますデータフィード。たとえば、代わりにあなたの製品のテーブルの上にamount_in_stock
列を持っていることの
は、「product_stock_transaction」テーブルがあります:1月2日に
product_stock_transactions
product_id FK transaction_date transaction_quantity transaction_source
1 1 Jan 2012 100 product_feed
1 2 Jan 2012 -3 stock_adjust_feed
1 3 Jan 2012 10 product_feed
を、在庫量は97でした。
このデザインでは、調整とソースを追跡でき、複数のソースからデータを移動するときの管理が簡単です。
どちらのアプローチでも、インポート数とデータ量に応じて大量のデータが作成され、比較的単純なデータセットを取得する複雑なクエリが発生する可能性があります。
パフォーマンス上の懸案事項を前もって計画するのは難しいです。大量のデータを扱う「履歴」と「元帳」の両方が見られることがあります。しかし、Eugenが下記のコメントで述べているように、余りにも大きな元帳を取得した場合は、現在のレベルを要約して古いレコードを削除(またはアーカイブ)することで元帳テーブルをクリーンアップする必要があります。
は、ロールバックの問題のアプローチに完全に同意します。 –
一部のレコードでデータの整合性に問題がありますか? –
更新/挿入を実行する前に、不正な行(不正な日付、負の数値など)が除外されます(一部のケースでは完全インポートが拒否されます)。たとえば、制約違反、これはかなり頻繁に起こります。その後、完全インポートを拒否します。 –