0

ユーザーが過去に購入した製品のテーブルがあります。例えば

item_id - user_id - title - supplier_id - - supplier_name - date added

ユーザーのテーブル

user_id - name

サプライヤーのテーブルもあります。

supplier_id - supplier_name

時々、サプライヤーが特別オファーを提出し、それをユーザーに伝えたいと考えています...これは、1つのアイテムまたはボード全体である可能性があります.

私の質問は、これをどのように管理するのが最善かということです

ユーザーがシステムにサインインしたときに、すべてのオファーを調べてから、過去に購入したアイテムまたはサプライヤー全体に対してそれらを再度照合する場合ですか (オファーが全面的に提供されている場合)。

これには、たとえば 100000 人のユーザーと 1000 のオファーがあり、大量のクエリを実行するために大量のリソースが必要になる可能性があると考えています.... または、これを行う別の方法はありますか? 相互参照しやすい中間テーブルのどこかにあるかもしれません。

私はこれをすぐに書かなければならず、できるだけ効率的にそれをやりたいと思っていますが、これは私にとって新しいものなので、質問です.

これは、単純な解決策を持つ標準的な問題ですか?

助けてくれてありがとう。

4

3 に答える 3

1

2 つの異なるテーブルでオファーを管理するのは理にかなっていると思います。

  • 1 つのテーブルは、サプライヤから特定の製品を購入したユーザーを扱います。
  • 1 つのテーブルは、サプライヤーから何かを購入したユーザーを扱います。

最初のケースでは、次のようなクエリでそれらのユーザーを識別できます。(コードはテストされていません。)

select distinct user_id
from products  -- Seems like "purchases" might be a better name.
where supplier_id = ?
  and item_id     = ?;

2 番目のケースでは、このようなクエリを使用します。

select distinct user_id
from products
where supplier_id = ?;

GROUP BY 句を使用すると、SELECT DISTINCT よりもパフォーマンスが向上する場合があります。

最初のケースでは、製品 (アイテム) オファーのテーブルは次のようになります。

supplier_id  item_id  offer_start  offer_end
--
1            10156    2012-08-01   2012-08-15

そして、これらの行に沿ったクエリを使用して、それらのオファーを受け取るべきユーザーを取得します。

select distinct user_id
from products  -- Seems like "purchases" might be a better name.
inner join item_offers on item_offers.supplier_id = products.supplier_id
                      and item_offers.item_id = products.item_id
                      and current_date between item_offers.offer_start 
                                           and item_offers.offer_end
where supplier_id = ?
  and item_id     = ?;

1 人のユーザーに対してクエリを実行している場合 (多くの場合そうです)、ユーザー ID を WHERE 句に追加できます。巨大なテーブルであっても、WHERE 句はかなり選択的であると思います。

于 2012-10-08T19:07:32.843 に答える
0

「special_offers」(または必要なもの)と呼ばれる新しい個別のテーブルを作成し、サプライヤーとユーザーの両方との多対多の関係にします。

于 2012-10-08T17:08:53.913 に答える
0

特定のユーザーのレコードのみをクエリするので、大したことではありません。過去の注文からのすべての個別のitem_idと、個別のsupplier_idを照会します。これにより管理可能な番号が返されます。次に、それらのIDをオファーテーブルに結合して、関連するオファーを表示します。すべてのオファー(アイテム固有およびサプライヤー固有)を含む1つのテーブルを作成することも、それらを2つのテーブルに分割することもできます。

于 2012-10-08T17:09:05.607 に答える