私は現在、ユーザーが属性 (年齢、身長、町、学歴など) に基づいて他のユーザーを検索できる Web サイトを開発しています。私は今、ユーザー プロファイル間にある種の評価を実装したいと考えています。評価は、指定された 2 つのプロファイル間の類似性に基づいて、独自のアルゴリズムを介して計算されます。たとえば、ユーザー A は、ユーザー B に対して 85、ユーザー C に対して 79 という評価「一致評価」を持っています。B と C の評価は 94 などです。
ユーザーは特定の属性を検索し、評価によって結果をフィルタリングできる必要があります。
評価はプロファイルごとに異なり、検索を行うユーザーにも依存するため、ユーザー テーブルに単純にフィールドを追加して ORDER BY を使用することはできません。これまでのところ、私は2つの解決策を思いつきました:
私の最初の解決策は、考えられるすべてのユーザーの組み合わせの評価を計算し、それを別のテーブル (user1、user2、rating) に保存する、毎晩のバッチ ジョブを用意することでした。次に、このテーブルをユーザー テーブルと結合し、評価によって結果を並べ替えることができます。いくつかの計算を行った後、このソリューションはそれほどスケーリングしないことがわかりました。
式 n * (n - 1) / 2 に基づいて、10 人のユーザーに対して 45 通りの組み合わせが可能です。1,000 人のユーザーの場合、突然 499,500 の評価の組み合わせを評価テーブルに挿入する必要があります。
2 番目の解決策は、MySQL をそのままにして、アプリケーション内でオンザフライで評価を計算することでした。これもうまくスケーリングしません。検索で 100 件の結果のみが UI に返される必要があるとします (最高評価が一番上に表示されます)。10.000 人のユーザーがいて、ニューヨークに住んでいるすべてのユーザーを評価別に検索したい場合、ニューヨークに住んでいるすべてのユーザー (3.000 としましょう) をアプリにロードし、アルゴリズムを適用してからのみを返す必要があります。ユーザーへのトップ100。このようにして、DB から 2.900 の役に立たないユーザー オブジェクトをロードし、アルゴリズムで何もせずに CPU を浪費しました。
システムが数千ユーザーを超えてスケーリングするように、ユーザーが他のすべてのユーザーと個別の評価を持つことができるように、MySQL db または web アプリでこれを設計する方法はありますか?