2016-10-23 17 views
0

objectIDは12バイトに保存されていますが、シャードキーではうまくいきません。代わりに、_idに完全にランダムなint64(8バイト)を使用する方が良いのではないかと思いますか?MongoDB:_idにint64またはObjectIDを使用する方が良いですか?

私の考えでは、完全にランダムなint64を作成し、コレクションにまだ存在していないかどうかを確認します(擬似ランダムジェネレータはうまく機能しません)。そうでなければ、この_idでドキュメントを作成します。だから我々は8バイトしか使用せず、シャードキーのためにうまく動作する_idを持っています

あなたはどう思いますか?

+0

私の意見では、これは設計上の決定であり、なぜShardにObjectIDを選択するのかはわかりません。シャーディングの概念は負荷に広がっている。だからあなたのデザインに負荷を分散させるためには、どのフィールドが役に立つのかを考えてください。 – Elyasin

答えて

1

ランダムに生成された番号を一意のIDとして絶対に使用しないことを強くお勧めします。 1つのことは、本当に独自の乱数を作成することは決してできないので、新しいレコードを挿入するときには常にその存在をチェックする必要があります。別のかなり明白な理由は、int64には限界があるからです。

あなたの_idに使用されたObjectId、それが何のためにあるのかである、またはあなたは、GUIDの

を使用しない非常に良い理由がある場合はこちらをご覧ください:

Considerations when selected a shard key

+0

objectIDはシャードキーとして使うことはできませんので、メモリ内にもう1つのインデックスを持たなければなりません。 – loki

+0

ランダムに生成された数字で別のフィールドにスタンプし、本当に欲しい、または数字以外の文字を含み、独自のキーを生成するよりユニークな方法を考案します。シャードキーは単一のフィールドである必要はありません。複合シャードキーを使用できます。あなたの_idには乱数を使用しません。私はあなたのためのリンクをシャードのキーに含めるように答えを更新しました – pieperu

+0

@lokiシャードの鍵として使うことができます。それは非常に悪いものです。 –

1

優れたソリューションを取るですObjectID()、最初の4バイトをObjectIDの末尾に移動します。この新しいObjectIDは絶対に一意であり、線形に増加するタイプではないため、シャードキーとして使用できます。

+0

どのようなオーバーヘッドの一種です。 '_id'フィールドは_anything_である可能性があります。なぜそんなに悩まされているのですか? UUIDは良いものになるでしょう。 –

+0

でもuuidは16バイトですか?それは問題ではない? – loki

関連する問題