2011-01-27 5 views
3

基本的に私の質問は - 私は価格のリストを持っています。そのうちのいくつかは歴史的です(つまり、Xは3月11日に0.99ドル、4月1日に1.99ドルなどを検索できるようにしたい)。この情報を保存する最良の方法は何ですか?履歴表をMySQLテーブルに保存する最も良い方法は何ですか?

私はおそらく、価格テーブルの外来キーを持つ商品テーブルを持っていると仮定しました。私は当初は現在の価格を保管することが最善の策だと思っていましたが、私は過去の価格データを保管したいと思うので、価格表のために以下のようなテーブルを保管する方が良いでしょう:

CREATE TABLE prices (
     id BIGINT auto_increment not null, 
     primary key (id), 
     price DECIMAL(4,2) not null, 
     effectiveStartDate DATETIME NOT NULL, 
     effectiveEndDate DATETIME 
); 

私はここで少し迷っています。効率的に製品を検索し、その製品の価格がどのように変化したかを確認したいと考えています。どのように効率的にこれらの価格のセットを製品に関連付けることができますか?私は、特定の日付にまたがるクエリを効率的に検索できるようにするために、これをインデックスする最良の方法は何でしょうかと尋ねています。

+0

本当に歴史的な価格を見たり、注文時の商品の量を知りたいですか?私は、その部分が2008年に12ドルだったのを見て、今は17ドルである必要がある理由は全く見当たりません。 – HLGEM

+0

idをproduct_idに置き換え、主キーをproduct_id、price、およびeffectiveivestartdateにすることを検討します。 –

+0

@HLGEM:会計システムでは、前年度の購入/調整に合わせて履歴データを記録するのが一般的です。 –

答えて

9

履歴データの必要性と現在の価格の必要性を区別します。これは以下を意味します。

1)製品表に現在の価格を維持します。

2)価格が変更された場合は、新しい価格を開始日のみを履歴テーブルに挿入します。前の行から取得できるので、終了日は実際には必要ありません。

注文履歴には別の種類の履歴が表示され、実際の購入は時間の経過と共に一定価格で提供されることにも注意してください。

4

最初にがこれを行う必要があることを確認してください。注文を同じデータベースに保管していますか?そうであれば、時間の経過とともに注文のアイテムの価格を調べることによって、過去の価格動向をいつでも見ることができます。これにより、価格変更と注文パターンの変更との間に相関関係を作成することもできます。価格変更によってにはの注文が行われた場合のみ対応します。

言われているように、あなたが価格変更の独立した記録を望むなら、あなたが提示したものは良いです。私が推奨するのは、終了日を削除することだけです。製品にの価格や価格の重複がある場合は、開始日が間に合うように計画していない限り、ロジックが簡単になります。

1

終了日は、商品の価格(つまり、さまざまな季節のプロモーションなど)を先に計画できる、より複雑なシステムの場合には有効です。 (オハイオ州、これはBSです、それについてもっと考えていたはずです...他の何かによって差別化された同時に商品の複数の価格を計画する場合、あなたは終了日を必要とします...まだそれはしばしば

実際には、最も複雑なシステムでは、現在の価格が「ディメンション」のみで区別されることは珍しくありません(つまり、実際の出荷場所によって決定されるいくつかの種類の属性

カスタム "id"主キーを省略して[product_id、starting_date、..?]を指定する前に、プラットフォーム/言語/フレームワーク/作業スタイルを2回確認します。 。]コンポジットpk。後者はやや論理的な選択です(少なくとも個人的には好きですが)。たとえば、DBライブラリがより複雑な主キーで作業する方法が限られているなど、時には逆行する可能性があります。

+0

答えをありがとう。私は実際にCodeIgniter(PHP)をDebian Linuxマシン上でMySQLと共に使用しています。これは別個の質問かもしれません、もしそうなら、私はそれを個別に尋ねることができますが、この複雑な主キーをMySQLでどのように構造化するか知っていますか?それも可能ですか? – jwir3