2012-04-14 17 views
0

私はすでに回答を知っていると思われる質問がありますが、私はあなたの意見を残したいと思います。店舗データベースの履歴データを維持する

私はシンプルなショップデータベースを作成しています。私はProductテーブルとOrderテーブルを持っており、これらの2つの間にOrder2Productというジャンクションテーブルを作成して注文の内容を格納しています。

Product 
- id (pk) 
- name 
- price 

Order 
- id (pk) 
- order_date 
- customer (fk) 

Order2Product 
- order (fk) 
- product (fk) 
- quantity 

この小さなモデルでは、Order2Productテーブルにレコードを追加し、各レコードに数量を設定して注文を保存できます。

ただし、このモデルでは履歴データは保持されません。店主が商品3の価格を変更し、商品3が1年前の注文である場合、その注文の価格が変更されるため、たとえば、注文が行われました。

製品名も同じです。店主が商品の「キャンディボックス」の名前を「ジャックダニエルのギフトボックス」に変更すると、これは請求書の転載に不思議に見えます。

私の意見では、製品の外部キーを使用して製品にリンクするのではなく、Productテーブルの名前と価格をOrder2Productテーブルにコピーするだけです。

あなたはどう思いますか?データの複製はデータベース設計上の悪い習慣であるため、面白くないと感じます。一方、これは、私が置かれた注文の信頼できる記録を維持したい場合には、他に解決策がないケースだと思います。

代わりに、製品リビジョンを使用してレコードの変更ごとに新しい製品レコードを保存することもできます。しかし、このモデルは、ユーザーがAccessデータシートを介してデータに直接アクセスできるMs Accessを対象としているため、製品レコードを変更することができます。

答えて

1

標準的な解決策は、Order2Productテーブルに保存する明細レコードに価格とその他の時間に敏感な情報(税率など)を格納することです。詳細レコードの価格が製品レコードの価格と異なるため、これは第3正規形の破損ではありません。

これは、古いNorthWindデータベースの仕組みです。これはMicrosoft Accessで配布されていたサンプルデータベースでした。

+0

とにかく価格と商品名と税率をコピーします。注文があったときの状況を反映させる請求書が必要です。ありがとう。 – Julius

+0

私は製品名をコピーしませんが、あなたの意見を取ります。請求書を転載することができることが法的に要求されることがよくあります。さらに、製品記録はランナーを行う可能性があります。それは私自身のアプリケーションの場合です。もちろん、顧客レコードの情報を同じ理由で注文ヘッダーにコピーすることもできます。 –

+0

私はまだ顧客情報を考えていませんでした。いい視点ね。 – Julius

1

1つのエントリが「現在の価格」で、もう1つが「日付の価格x」であるため、価格のデータを複製していません。これらは同じかもしれませんが、そうであることは保証されません(あなたが認識するように)。しかし、名前をコピーする必要はありません。製品名が変更された場合、それは注文時に結ばれたままにしておきたい(別のIDを持つ)新商品または同じIDを持つ再梱包された商品です(ただし、その時点で別の商品名であっても)。だからあなたは商品IDにリンクしたいと思っています。別のテーブルに名前の変更の記録を残し、製品レコードにフラグを設定することもできます。

関連する問題