時間の経過とともにウェブサイトのアイテムの価格をうまく追跡したいのですが、 1つのオプションは、postgresql 9.5 - 時間の経過とともに値が変化する
create table prices (
name text,
price decimal,
updated timestamp
)
のようなテーブルを持つだけで、価格を更新するたびにこのテーブルに新しい行が作成されます。私は価格ごとに5を更新しています
- 私は、任意の時点で数千個のアイテムを追跡しています: はしかし、私はこのアプローチは次のような理由から、私の状況では非常に「素敵」ではないと思います価格は通常非常に頻繁に変更されることはなく、時には変更されないこともあります。これらの理由の
、特定の項目のために、と言う、dove bodywash
は、私の価格表には、すべてが少しばかげ
'dove soap' | 3.00 | <a new timestamp every 5 minutes>
のように見える200行を含めることができます。 私の意見では、商品が特定の価格を持っていた時間範囲を格納するprice_history
テーブルを追加するのはずっと良い解決策です。例えば、price_history
列
name | price | created_at | updated_at
を持っているかもしれないし、望ましい行動は、私がdove soap
の価格を更新するたびに、自動的に価格が変更されているかどうかをチェックし、トリガーがあるだろうということだろう - それはしていない場合次に、prices_historyの対応するエントリのupdated_at
を変更し、もしあれば、新しい価格のprices_historyに新しい行を作成します。実行の例として、私は持っていたい:
1)時には私はinsert into prices ('dove soap', 3.00)
です。この時点で、price_history表Iはupdate prices set price = 3.00 where name = 'dove soap'
を行うTIME2で)
|'dove soap' | 3.00 | time1 | null |
2行を含むであろう。今度のprice_historyテーブルは、
'dove soap' | 3.00 | time1 | time2
のようになります。3)時刻3に価格はまだ3.00です。 price_historyは
のようになります。'dove soap' | 3.00 | time1| time3
4)時刻4の価格は3.50です。 price_historyは今のようになります。
'dove soap' | 3.00 | time1 | time3
'dove soap' | 3.50 | time4 | null
私の問題は私が何を100%わからないんだけど、これはこれについて移動する良い方法であるかどうかわからないんだけど、と
- ですこれを実装する良い方法があります。
上記のいずれかのアドバイスは大変ありがとうございます。
おかげで
編集:-):私は私が見て一つのことは、同様の価格を使用していますtemporal_tables
PostgreSQLの拡張であったことを含まなければならない/ price_history /設定します。問題は、価格が更新されるたびにprice_historyテーブルに新しい行が作成され、変更されていない場合はイベントが目的を破るように見えるということです。このデフォルトの動作を変更する方法はないようですが、誰かが分かっていれば教えてください!
私は同様の状況があります。私のレコードはそれぞれ開始日と終了日を持っています。レコードが追加されるたびに(新しい開始日を使用して)、トリガが起動して、前のレコードの終了日が適切な日付に更新されます。あなたのケースでは、私は価格が同じ場合に挿入されない挿入前にトリガを追加します。何も変更されていなければ、updated_atの変更を気にしません。最後に、私はあなたが唯一のテーブルと現在のレコードを抽出するビューとしてprice_historyを呼んでいるでしょう。 – mlinth
返信いただきありがとうございます!あなたはそのようなトリガを作成する例へのリンクを持っていることがありますか?私はかなりSQLに新しいですし、物事がどのように動作するのかをよく理解していません。 – ira