2017-07-19 4 views
0

私の問題をまず説明し、私が実装している解決策を試してみましょう。私は特定のユーザーと共有できる "イベント"のコレクションを持っています。私はまた、 "ユーザー"のコレクションを持っています。どのユーザーも、任意の数の他のユーザーとイベントを共有できます。イベントがユーザーと共有されると、そのユーザーが自分のウェブサイトのホームページに表示されます(簡単にするために、作成日によってソートされているとします)。mongodbによるシャーディング。私のクエリを書くための最適な方法

シャーディングを使用して、自分の書き込みと読み取りの両方のバランスをとり、必要に応じて水平に拡大することができます。私がシャーディングを考える前に、イベントコレクションがありました。イベントコレクションには、ユーザーIDの配列がありました。それらのuserIdはイベントを見ることができるものです。私の質問は、そのアレイ内にログインしたユーザーが作成日時でソートされ、ページサイズに制限されるすべてのイベントでした。

このシナリオでシャーディングを実装するには、クエリで返されるすべてのイベントにその埋め込み配列内のuserIdがあるため、どうやらシャードキーとしてuserIdを持つことが明らかです。しかし、私のuserIdは配列内に含まれているので、うまくいきません。

  • イベントIDを(単調さを避けるために、ハッシュ化されたシャードキー、)のObjectId:

    • のuserId:私はその後かかわらず、次のフィールドで、新しいコレクションを持っているのObjectID
    • のCreationDate:日付

    このようにして、私はuserIdによってクエリを実行し、それを対応するシャードにのみ移動させることができます。このソリューションの私の問題は、イベントの代わりにeventIdsがあることです。これは大した文書なので、コレクション内に埋め込まれたドキュメントとして重複しないようにしたい(多くのユーザーを同じ共有することができますイベント)。

    これを解決するには、イベントアイデアをイベントコレクションのシャードキーにすることが正しいソリューションだと思います(再び、単調さを避けるためにハッシュします)。その後、これらのIDだけでイベントコレクションを照会できます。

    これは、二つの問題を提起:

    1. が、これは、この特定の問題を考えるための正しい方法です。それは良い解決策ですか?
    2. 私は今ではいくつかのイベントIDを持っているので、5つを言いましょう。それぞれが異なるシャードに置かれています。より良いパフォーマンスが得られます。単一のクエリーで5つのIDを探したり、5つの異なるクエリーそれぞれのIDを1つずつ探していますか?
  • 答えて

    0
    1. はい、これは正しい方法と解決策です。 userIdとeventIdでシャードされたイベントで分けられたユーザー。
    2. 後者です。単一のIDを検索する5つの異なるクエリ。クエリは1つのシャードに移動するためです。同じ时间($ in:[])で5つのidを見ているものを単一のクエリで見ると、おそらく複数の断片に分散します。
    +0

    2番目の点については、あなたは、($ in:[])がそれを散らばってしまうと言いますが、これは絶対に真実です。しかし、5つの異なるクエリーを実行すると、各クエリーが異なるシャードに移動する可能性もあるため、「分散」します。私の言うことは、影響を受ける破片はどちらの場合もまったく同じものでしょうか? – manugarciac

    +0

    しかし完全には違いはありません。シャードに1つのIDだけを持つクエリを送信すると、シャードはそれをインデックスから非常に高速に見つけます。すべてのシャードとシャードにIDのリストを送るには、そのインデックスを複数回通過させて、それらのIDのどれが "彼"のインデックスにあるのかを調べる必要があります。複数の単一のidクエリは並列であり、複数のidクエリは並列ではありません。 – JJussi

    +0

    私は参照してください。異なるクエリを使用すると、実際にはアプリケーションのロジックが簡単になります。そのようにしても、それと同じ場合でも、それは優れています。 1つだけのクエリに対して複数のクエリを実行するオーバーヘッドについては心配する必要はありませんか? – manugarciac

    関連する問題