1

顧客の製品注文が行われたときのスナップショットを取得するために、他のテーブルから 1 つ以上のフィールドをコピーする注文または請求書の line_item テーブルをよく見かけます。

ただし、私のスキーマでは、データをコピーせずに注文のビューを生成できます。したがって、注文/製品/価格データの検索には少しコストがかかりますが、コピー/挿入の時間、スペース、および冗長性を節約できます。コピー/挿入は 1 回限りのトランザクションであることは理解していますが、ルックアップは何度も必要になります。問題。

したがって、a) 私のスキーマはスナップショットなしで正確なルックアップをサポートし、b) ルックアップの最適化を強く必要としないため、スナップを取得する代わりに計算を実行することは理にかなっていると思います-ショット。または、私が見逃しているものがありますか?このような場合は常にスナップショットを撮る必要がありますか?

ルックアップ計算がどのようになるかの例を次に示します。

# display order items for a particular order on a particular date

# get order, products and base prices from order_id

order_products = SELECT * FROM order_has_product ohp
                          INNER JOIN price ON (price.product_id = ohp.product_id)
                          INNER JOIN order ON (order.id = ohp.order_id)
                          WHERE order_id = ?


# calculate price of each product at order.datetime_opened

for op in order_products:

    tax = SELECT SUM(tax.rate) FROM product_has_tax pht
             INNER JOIN tax ON (tax.id = pht.tax_id)
             WHERE pht.product_id = op.product_id
                 AND tax.date_start <= op.datetime_opened
                 AND tax.date_end >= op.datetime_opened

    discount_product = SELECT SUM(discount.rate) FROM product_has_discount phd
             INNER JOIN discount ON (discount.id = phd.discount_id)
             WHERE phd.product_id = op.product_id
                 AND discount.date_start <= op.datetime_opened
                 AND discount.date_end >= op.datetime_opened

    discount_customer = SELECT SUM(discount.rate) FROM customer_has_discount chd 
             INNER JOIN discount ON (discount.id = chd.discount_id)
             WHERE chd.customer_id = op.customer_id
                 AND discount.date_start <= op.datetime_opened
                 AND discount.date_end >= op.datetime_opened
                 AND (chd.date_used_limited IS NULL OR chd.date_used_limited = op.datetime_opened)

    discount = discount_product + discount_customer

    price = op.price * (1-discount) * (1+tax)
4

2 に答える 2

5

私が取り組んだオンライン販売アプリケーションでは、計算された税金と価格を、注文が行われるたびに個々の注文に常にコピーしていました。これが「スナップショット」オプションです。再計算することはありませんでした。なんで?

  • 価格は変わります。スナップショットは、現在の価格ではなく、製品が注文された時点の価格をキャプチャします。
  • テーブルが変わります。ビューについて知り、ビューのみを使用するために、価格のすべてのプロデューサーとコンシューマーに依存しています。永遠に。スナップショットを提供すると、将来のデータ コンシューマーはそれがどのように計算されたかを気にしません。
  • スキーマが変更されます。オンタリオ州は、売上税の計算方法と課税対象の製品を変更しています。これはビューを壊しますが、スナップショットではありません。
  • ルールが変わります。クライアントがクーポンやプライスマッチなどのルールをオーバーライドする方法を提供する必要がありました。スナップショットの価格をオーバーライドすることでこれを行うことができますが、ビューではできません。
于 2009-11-18T20:58:21.087 に答える
1

通常、スナップショットは、データ ウェアハウジングや顧客の苦情処理など、各販売の正確な記録を簡単に保持できるようにするために使用されます。スナップショットでは、単一のテーブルを安全に保ち、バックアップし、厳密な監査を行うだけです。

自分のやり方でそれを行うと、その保証を得ることが非常に難しくなります。これは主に、関係するテーブル (割引、税金、製品、注文など) を誰もいじらないようにする必要があるためです。たとえば、誰かが 2005 年 1 月の割引率を変更した場合、どのように判断しますか? さらに、これにより、データ モデルを簡単に進化させることができなくなります。割引率用に複数の列が必要になった場合、将来のために計算を変更するだけでなく、古いものを保持する必要があります。過去のために(または、後方互換性のある方法ですべての変更を行います。)

スペースは安価です。スナップショットを使用すると、わずかなコストで多くのことが簡単になります。

于 2009-11-18T20:49:13.843 に答える