独自の_id
を生成することの利点 s:
-
1
の増分番号を割り当てることで、より人間に優しいものにすることができます。 、2
、3
、... -
または、ランダムな文字列を使用して、より人間に優しいものにすることができます:
t3oSKd9q
(これは画面上のスペースをあまり占有せず、リストから選択でき、必要に応じて手動でコピーできる可能性があります。ただし、衝突を防ぐために十分な長さにする必要があります。)
-
ランダムに生成された文字列を使用する場合、同じ時間に作成されたレコードを同じシャードにグループ化する傾向がある標準のmongo ObjectIdとは異なり、シャーディングの分布はほぼ均等になります。 (それが役立つかどうかは、シャーディング戦略によって異なります。)
-
または、独自のカスタム
_id
を生成することもできます s関連するオブジェクトを1つのシャードにグループ化します。所有者、地理的地域、またはその組み合わせによる。 (繰り返しになりますが、それが望ましいかどうかは、データのクエリ方法や、データの生成と保存の速度によって異なります。_id <ではなく、シャードキーを指定してこれを行うこともできます。 / code> 自体。以下の説明を参照してください。)
ObjectId
を使用する利点 s:
-
ObjectIdは、衝突を回避するのに非常に優れています。独自の
_id
を生成する場合 ■ランダムにまたは同時に、衝突のリスクを自分で管理する必要があります。 -
ObjectIdには、作成時間が含まれています。これは、ドキュメントの作成日を保持し、ドキュメントを時系列で並べ替える安価で簡単な方法です。 (一方、ドキュメントの作成日を公開/リークしたくない場合は、そのObjectIdを公開しないでください!)
nanoid モジュールは、短いランダムIDを生成するのに役立ちます。また、計算機 も提供します。 これは、1時間に生成するドキュメント/ IDの数に応じて、適切なIDの長さを選択するのに役立ちます。
または、mongoose-generate-unique-key と書きました。 非常にを生成するため 短いランダムID(マングースライブラリを使用している場合)。
シャーディング戦略
データをシャーディングする最善の方法について専門家であるとは言いませんが、次のような状況が考えられます。
-
天文台または粒子加速器は、1秒あたりギガバイトのデータを処理します。興味深いイベントが検出された場合、彼らは大量のデータを保存したいと思うかもしれません。 ほんの数秒で。この場合、おそらくシャード全体にドキュメントを均等に分散させて、各シャードがデータを保存するために同じように一生懸命働き、誰のシャードも圧倒されないようにする必要があります。
-
膨大な量のデータがあり、すべてを処理する必要がある場合があります 一度に。この場合(ただし、アルゴリズムによっては)、均等な分散が再び望ましい場合があります。これにより、すべてのシャードが、最後に結果を結合する前に、データのチャンクの処理に等しく懸命に取り組むことができます。 (ただし、このシナリオでは、シャードキーではなく、MongoDBのバランサーを使用して均等に分散できる場合があります。バランサーは、データが保存された後、バックグラウンドで実行されます。大量のデータを収集した後、次のことを行う必要があります。チャンクを一晩再配布するためにそのままにしておきます。)
-
大量のデータを含むソーシャルメディアアプリがありますが、今回は多くの異なるユーザーが多くの簡単なクエリを実行しています 主に彼ら自身のデータ、または彼らの特定の友人やトピックに関連しています。この場合、ユーザーが小さなクエリを実行するたびにすべてのシャードを含めることは意味がありません。 1人のユーザーに属するすべてのドキュメントが1つのシャードに保存されるように、userId(またはトピックまたは地理的地域)でシャードすることは理にかなっています。そのユーザーがクエリを実行すると、1つのシャードだけが作業を行う必要があります。これにより、他のシャードが他のユーザーのクエリを自由に処理できるようになり、一度に多くのユーザーにサービスを提供できるようになります。
-
作成時までにドキュメントをシャーディングする (デフォルトのObjectIdsが提供する)同様の期間のデータを調べる軽いクエリがたくさんある場合は、これが望ましい場合があります。たとえば、さまざまなユーザーがさまざまな履歴チャートをクエリしています。
ただし、ほとんどのユーザーが最新のドキュメントのみをクエリしている場合(ソーシャルメディアプラットフォームでの一般的な状況)は、1つまたは2つのシャードがほとんどの作業を取得することを意味するため、それほど望ましくない場合があります。トピックごと、またはおそらく地域ごとに配布すると、全体的な配布がよりフラットになる可能性がありますが、関連するドキュメントを1つのシャードにまとめることもできます。
このテーマに関する公式ドキュメントを読むことをお勧めします: