私は現在、DBから新製品のランダムサンプリングを取得したいMongoDBのプロジェクトに取り組んでいます。しかし、私の問題はMongoDB固有のものではなく、データベースに関する一般的な質問だと思います。
シナリオ:
製品のコレクション(またはテーブル)があるとしましょう。また、ユーザーのコレクション(またはテーブル)もあります。ユーザーがログインするたびに、10個の製品が表示されます。これらの製品は、コレクション/テーブルからランダムに選択されます。簡単ですが、ユーザーがログインするたびに、これまでに見たことのない10個の製品を提示する必要があります。この問題を解決するために私が考えることができる2つの明白な方法は次のとおりです。
すべてのユーザーは、すべての製品の独自のプライベートリストから始めます。これらの製品のいずれかを入手するたびに、その製品はプライベートリストから削除されます。その結果、次にこの以前にトリミングされたリストから製品が選択されたときに、新しいアイテムのみがすでに含まれています。
すべてのユーザーは、以前に表示された製品のプライベートリストを持っています。ユーザーがログインすると、マスターリストからランダムに10個の商品を選択し、それぞれのIDを以前に表示した商品のリストと比較します。アイテムが以前に表示したリストに表示された場合、アプリケーションはこれを破棄して新しい商品を選択します、そして10個の新しいアイテムができるまで繰り返し、次にそれを以前に表示したリストに追加します。
#1の問題は、それが途方もない無駄のように見えることです。基本的に、n人のユーザーのリストデータを複製することになります。また、システムへの新しいアイテムの削除/追加は、すべてのユーザーを反復処理する必要があるため、悪夢になります。#2の方が望ましいようですが、問題もあります。10個の新製品を保証するために、DBに対して多くの余分で不要な呼び出しを行うことになります。ユーザーがより多くの製品を経験するにつれて、選択できる新しい製品が少なくなるため、1つを捨てて、DBから新しい製品を入手しなければならない可能性が大幅に高まります。
別の解決策はありますか?私の最初のそして主要な関心事はパフォーマンスです。パフォーマンスを最適化するために、ディスク容量を放棄します。