3

のは、私はこれらのテーブル/モデルを持っているとしましょう:ユーザーのウィッシュリストにある製品の価格低下を追跡する方法?

Product 
- id 
- last_updated_date 
- name 
- price 

User 
- id 
- name 

WishlistItem 
- id 
- user_id 
- product_id 

Productテーブルには、数百万の記録を持っており、(古いものをドロップする、新しいテーブルに挿入する)データのインポートを経由して、毎晩自動的に更新されています。私は基本的にそのテーブル/モデルへの読み取り専用アクセスを持っています。

ユーザーのウィッシュリストに商品があり、価格が下がった場合、そのユーザーに通知することができます。どのような方法でこれを行うことができますか?

私はアイデアのカップルを持っている:

  1. は、ウィッシュリストモデルにProduct.last_updated_dateを追跡し、定期的にそれが更新されているかどうかを確認するために、製品のテーブルをポーリングします。これは、恐ろしい/非スケーラブルなソリューションのように思えます。

  2. Productテーブルが更新されたときにトリガーするPostgres ViewまたはFunctionの種類ですか?私はpostgresを初めて使っているので、これが可能かどうかはまだ分かりません。あなたは私が右方向に任意のヘルプは大歓迎です:)

考えていないことを示唆することは驚くべき

  • 何か!


    UPDATE:ウィッシュリストエントリ自体の内部で現在の価格をキャッシュして来た ひとつのアイデア、すなわち:

    WishlistItem 
    - id 
    - user_id 
    - product_id 
    - price 
    

    ...その後、インポートした後、私は比較できWishlistItem.price Product.priceを使用して通知します。これはうまくいくものですが、このアプローチでは、すべてのユーザーのすべてのWishlistItemに基本的に価格データのキャッシュされたコピーが保存され、更新があればすべてのリストを新しい価格で更新する必要があるため、私はそれのまわりに道があるとは思わない。


    UPDATE: 最後に、私は、私は、更新トリガに標準使用できるように、私はおそらくちょうどデータのすべてのバージョンを追跡しなければならないことを決めました。これにより、すべての価格変更の記録を持つことができ、価格動向などを追跡できます。

  • +0

    あなたのアップデートは、下の私の提案、非正規化価格に沿っています。あなたの製品テーブルを交換するので、他のテーブルであなたのオリジナル価格を記録する必要があります。通知は、あなたが言うように、ウィッシュリストテーブルを更新することによってマークする必要があります。また、通知テーブルを持ち、ユーザー/製品ごとに1つの通知しか許可しないなどの解決策があります(ウィッシュリストのIDを追加して、 。 – Teson

    答えて

    2

    を通知テーブルを生成するが、Productテーブルが実際にされていないように聞こえます更新され、置き換え中です。この場合、トリガーをトリガーする更新はないので、価格をWishlist(user247245の注釈)にキャッシングし、価格変更をProductにスキャンすることで、難しい方法を実行する必要があります。

    Productsが卸売ではなく更新されている場合は、価格が変更されたときに注意を喚起し、利害関係者に通知する手配をすることができます。このトリガは、おそらくProduct_price_changesと呼ばれるProductsアップデートのロックを避けるために、通知を別のテーブルに挿入することによって通知をキューに入れます。 Productsの更新が完了したら、別のタスクでProduct_price_changesWishlistと比較し、関心のあるユーザーに通知し、Product_price_changesのすべてを削除して終了することができます。

    最近のバージョンのPostgreSQLでは、ローの変更ごとに起動するのではなく、カラムが変更されたときにのみ起動するようにアップデートトリガを制限できます。

    +0

    テーブルが卸売されていない場合、更新トリガーが正しい方法になるようですが、それはそうです。残念ながら、 'Products'テーブルは膨大であり、データのインポートには本当に時間がかかります。行を無作為化するのではなくテーブルを置き換えると、速度が大幅に向上しますが、更新トリガーを使用する能力は失われます。私はより重要なものを評価しなければならないと思う:総輸入速度または更新トリガーを持つ能力。私は、インポートが完了した後に 'product_price_changes'を作成するルビーオブザーバと同じ機能を模倣できるかもしれません。 – markquezada

    +0

    'Product'の値は本当にどのくらいの頻度で変更されますか?毎日の製品データのダンプが外部ソースから来た場合、diff/patch契約(テキストファイルの場合は単純なdiff(1)さえあるかもしれない)システムを少し修正して、その変更を 'Product'テーブルに適用します。このトリックは、作業負荷を軽減するか、または「Product」をロックしてオンラインシステムの状態になるのを避けるために小さなチャンクに広げます。うまくいけば、 "大きなデータベース"のクルーが明日いくつかの新鮮なアイデアで登場するでしょう。 –

    +0

    それは頻繁には変わらないかもしれませんが、問題は私が扱っているレコードとデータの膨大な量です。それは数百万のレコードなので、更新されているレコードはわずかですが、まだかなりの多くのデータ(私は他のテーブルもインポートしていますが、これはやや大きなデータセットに含まれています)あなたは正しいですが、インポート時にテーブルを完全に置き換えることを再考する必要があるかもしれません... – markquezada

    2

    ウィッシュリストテーブルに「price」フィールドを追加します。低価格の製品テーブルクエリの更新後は、あなたがProductに更新トリガーを使用することができ、結果として

    について、 /トン

    +0

    良いアドバイス。私はそれを試してみます。 – markquezada

    関連する問題