2017-01-19 11 views
1

私はプロジェクトで作業していますが、私がかなり一般的な状況だと思うデザインジレンマを打つと、どのように処理しているのか教えてください。 ショップのWebアプリケーションを構築しているとします。カタログテーブルがあり、多数の行があります(例:参照データを変更して「履歴」を維持する

ID |名前|価格

  1. |おもちゃの車| 10 $
  2. |テディベア| 2 $

お支払い方法で表を注文します。 商品の購入を意味する注文の詳細に関するデータはどのように保存する必要がありますか?主な関心事は、価格変更のようなカタログ表の変更をどのように処理するかです。私が思いついた

ソリューションは、以下のとおりです。

  1. は、カタログに類似した構造を持つテーブルORDER_DETAILSと受注テーブルと多対1の関係にあります。ユーザがsthを購入すると、必要なデータがカタログテーブルからorder_detailsテーブルにコピーされます。これは、列のすべて(または少なくともいくつか)をコピーするときに大きな記憶域を必要とし、カタログ表の列変更の場合は、変更をorder_detalsに伝播する必要があります。

  2. もう1つのアイデアは、(データウェアハウジングから)ゆっくりと変化する次元のメカニズムを利用することです。カタログ表には次のような追加の列が必要です。

ID |名前|価格|バージョン

  1. |おもちゃの車| 10 $ | 1

  2. |テディベア| 2 $ | 1

  3. |テディベア| 4 $ | 2

order_detailsテーブルとordersテーブルとの多対一の関係とカタログテーブルとの多対1の関係。この場合、order_details表には同じ数の行がありますが、列の数は少なくなります。このアプローチの欠点は、製品のバージョンを管理する必要があることです。

+1

重複:http://softwareengineering.stackexchange.com/questions/258234/best-approach-for-an-online-store-which-changes-its-product-s-price-over-time; http://stackoverflow.com/questions/3469803/how-to-handle-price-fluctuations-in-an-invoice-application; http://stackoverflow.com/questions/11818965/how-to-properly-relate-items-to-pricing-data-taking-price-change-history-into-a – jaco0646

+0

あなたは正しいです。私はそれのようなsthを探していたときに、ちょうどときにそれは "正しい質問"を求めるのは難しいときに設計の質問になる –

答えて

2

同様の質問に対する回答は、バージョン標準フォームについて説明しているhereです。

価格(および追跡する他のデータ)を別のテーブルに正規化する必要があります。 FKは引き続き正常に機能します。あなたがしなければならないことは、注文が行われたときに有効だった価格を得ることだけです。これはちょっと難しいことですが難しくありません。

+0

これはJaco0646の答えに似ており、私はそれが魅力的だと思う。ありがとう –

1

一般的に、あなたのdbデザインはお店のアプリケーションロジックによって異なります。しかし、私は、このアプローチはあなたを助けることを推測することができます

はテーブル catalog_prices (priceId, productId, price, date)を作成し、 カタログテーブルの変更 priceIdから price列インチしたがって、 すべての商品に1つの現在の価格があり、catalog_pricesには商品価格の履歴があります。だから、クエリ

SELECT c.ID, c.name, p.price FROM catalogs AS c 
INNER JOIN catalog_prices AS p ON c.priceId = p.priceId 

価格とクエリ

SELECT c.ID, c.name, p.price, p.date FROM catalogs AS c 
INNER JOIN catalog_prices AS p ON c.ID = p.productId 

ですべての製品を返しますが、すべての価格履歴を返します。

次はorder_detailsのテーブルの追加productPriceIdの列。したがって、クエリ

SELECT d.ID, d.orderId, c.name, p.price FROM order_details AS d 
INNER JOIN catalog_prices AS p ON p.priceId = d.productPriceId 
INNER JOIN catalogs AS c ON p.productId = c.ID 

は価格と注文詳細を返します。

このソリューションは、カタログ製品と注文製品を表示するための追加結合を追加しますが、データの複製を削減します。価格は1か所に保存されます。そして、あなたは製品価格の履歴を見ることができます。

関連する問題