発効日の価格を保存する方法は?


21

製品のリストがあります。それらのそれぞれは、Nプロバイダーによって提供されます。

各プロバイダーは、特定の日付の価格を提示します。その価格は、そのプロバイダーが新しい価格を設定するまで有効です。その場合、プロバイダーは新しい日付で新しい価格を提供します。

現在、MySQLテーブルヘッダーは次のようになっています。

provider_id, product_id, price, date_price_effective

1日おきに、当日に有効な製品/価格のリストを作成します。各製品のリストには、その特定の製品を持つプロバイダーのソート済みリストが含まれています。そのようにして、特定の製品をたまたま最良の価格で提供できる人に注文することができます。

有効な価格を取得するために、を持つすべての行を返すSQLステートメントがありますdate_price_effective >= NOW()。その結果セットは、次のようなファイルを取得するために必要なソートとフィルタリングを行うルビースクリプトで処理されます。

product_id_1,provider_1,provider_3,provider8,provider_10...
product_id_2,provider_3,provider_2,provider1,provider_10...

これは私たちの目的にはうまく機能しますが、SQLテーブルはおそらくこの種の情報を保存する最良の方法ではないという悩みがあります。この種の問題は、他のより創造的な方法で以前に解決されたと感じています。

SQL以外にこの情報を保存するより良い方法はありますか?または、SQLを使用している場合、私が使用しているものよりも良いアプローチがありますか?


lal00:コメントの1つで述べたように、私は定期的に効果的なデートを行っています。簡単な有効日処理方法については、私の回答をご覧ください。新しい価格行が作成されたときに価格が有効になる期間を知る必要も、新しい行が作成されたときに以前の最新の行を変更するために戻る必要もありません。
ビットツイダー

回答:


17

時間に基づいて変化するアイテム(「日付DのXの価格」や「日付Eの飼育場Qにいる牛」などに答えられるなど)については、「Developing Time-Oriented」の本を読むことをお勧めしますSQLのデータベースアプリケーション。」この本は絶版になりましたが、著者は本のPDFと関連するCDを彼のWebサイトで丁寧に利用できるようにしました。

http://www.cs.arizona.edu/~rts/publications.html(「books」の下の最初のアイテムを探します)。

オンラインの簡単な紹介については、以下を参照してください。


1
まあ、これは私が尋ねたときに私が念頭に置いていたものではありません、それは良いです!:)
edmz

3

私は確かに発効日をデータベースに保存します。結局のところ、人々はクエリを実行して、価格が時間の経過とともにどのように変化したかを確認したり、注文の異常を履歴製品価格表と照合したりする可能性が高いでしょう。実行しているクエリの種類と価格変更の頻度に応じて、現在の価格と過去の価格用に別々のテーブルを用意することは理にかなっています。

価格を保存するほとんどのシステムでは、有効日に加えて有効期限の列が必要です。これにより、前または次の行を確認する手間が省けるため、現在有効な価格を簡単に判別できます。特定の時点でどの価格が有効であったかを確認します。私はあなたのNOW() >= date_price_effective状態が何をしているのか明確ではありません-おそらく、それは私にとって奇妙に思えるすべての過去の過去の価格とともに現在の価格を返します。「実効価格」は、次のようなものによって定義される現在の価格になると思いますNOW() BETWEEN date_price_effective AND date_price_expired

また、ファイルがどのように見えるかについてもわかりません。どのような私にははっきりしていないprovider_1?またはどのようにしているがない理由data--プロバイダ注文- PROVIDER_ID = 1つの価格represents-- provider_1のために最初に表示されるproduct_id_1とする第三のproduct_id_2


ジャスティン、有効期限は理にかなっています。あなたは正しかった、私はSQLを逆に持っていた。出力ファイルは私の質問にあまり関係ありません。価格で製品を並べ替える必要があることを例示する方法として追加しました。
edmz

通常、行の作成時に価格が有効な期間が与えられないため、追加のオーバーヘッドが追加されるだけなので、各行に有効期限を含める必要はありません。テーブル内の各producer_id / product_idのペアにN行があり、それぞれが特定の日付に有効である場合、指定された日付以下の最大のdate_price_effective値を持つ行が有効な価格ですその日。私の投稿を見ると、このタイプのクエリを実行するSQLコードが表示されます。定期的に発効日を処理する必要があります。
ビットツイダー

@ bit-twiddler-確かに、有効期限を設定する必要はありません。ただし、一般に有効期限があると、テーブルのクエリがはるかに簡単かつ効率的になります。発効日クエリは一般に価格の変更よりもはるかに一般的であるため、通常、これはトレードオフです。
ジャスティン洞窟

3

問題ステートメントを正しく理解している場合、世代別データを処理する方法が必要です(つまり、テーブルには、それぞれ日付が重要なprovider_id / product_idのペアごとに複数の行が含まれています)。その場合、date_price_effective値が今日以下の製品の最新の価格を探しています。このタイプの状況は、SQL副選択を使用して簡単に処理できます。

 SELECT 
   provider_id, product_id, price, date_price_effective 
 FROM 
   price_table a 
 WHERE 
   date_price_effective = 
     (
       SELECT 
         MAX(date_price_effective) 
       FROM 
         price_table b 
       WHERE 
         b.provider_id = a.provider_id AND 
         b.product_id = a.product_id AND
         b.date_price_effective <= NOW() 
     );

価格は、クエリが実行された日付以下の最大のdate_price_effective値を持つ限り有効です。今日より大きいdate_price_effective値は、将来の発効日です。上記のコードは、provider_id / product_idの各ペアの行データを返します。このペアは、クエリが実行された日付に最も近いが、それ以降のdate_price_effective値を持っています。このソリューションは、価格を自動的に有効な日付範囲にまとめます。このテーブルの主キーは、トリプル{provider_id、product_id、date_price_effective};です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.