2

ユーザーIDをシャーディングしたSQL環境から来たので、これに少し苦労しています。シャードできるように、user_id が追加された複数のテーブルがありました。1 つのテーブルに 100 件のレコードがあり、すべてが同じユーザーの場合、100 件すべてが同じシャードになります。

これで、最初の mongo データベースができました。必要に応じてシャードできるようにしたいと考えています。_id で分割する予定のユーザー コレクションがあります。問題ありません。しかし、2 番目のコレクションがあり、1 人のユーザーに対して何百ものドキュメントが含まれる可能性があります。それらを同じシャードに移動させたいと思います (個別に取得されるため、ユーザー ドキュメントと同じである必要はありませんが、ユーザーによってチャンクで取得されます)。 2 番目のコレクションに追加された user_id によるシャードですが、これでは不十分です。シャード キーは一意である必要があるため、ルックアップを行うたびに、すべてのシャードを調べます。これは最適ではありません。では、コレクションごとにそのようなレコードを 1 つだけにするなど、完全に一意である必要がありますか?

ドキュメントは、問題があることを示しています。私が理解していないことを願っています。

4

1 に答える 1

5

いいえ、シャーディング キーは必ずしも一意である必要はありません (可能ですが)。たとえば、次のシャーディング キー{userID : 1, countryID : 1}は、フィールドを持つコレクションに対して完全に有効です (2 つの要素が同じ userID と countryID を持つことに注意してください)。

{userID : 4, countryID : 5},
{userID : 4, countryID : 9},
{userID : 1, countryID : 5},
{userID : 2, countryID : 3},
{userID : 4, countryID : 5},
{userID : 5, countryID : 4}

私が覚えている限りでは、mongo では欠落しているキーに対してのみシャーディング キーを作成することはできません (そしてそれに関するバグがありました)。また、これ以降、シャーディング キーの値を変更することはできません。

{a : 5}ただし、すべてのコレクションで同じフィールドを使用して、それをシャーディング キーとして使用することもできます (これはまったくばかげていますが、実行できます)。

シャーディング キーを選択するときは、慎重に行う必要があります。後で変更するのは大変な作業だからです。良いことは、シャーディングキーの選択方法をしばらく読んだことです。

于 2013-11-13T05:36:32.030 に答える