2017-01-08 5 views
1

データストアエンティティのIDを設定するための3つの方式があります。AppEngineのデータストア:事前割り当て正規分布のID(* *単調に増加していない)

  1. は、独自の文字列またはint64 IDを提供します。
  2. それらを提供せず、AEにint64 IDを割り当てさせてください。
  3. int64 IDのブロックを事前に割り当てます。

    この(1):

    クラウドデータストアは、2つの 異なる自動IDポリシーを使用して、オートIDを生成するように構成することができる。

    documentationは、ID生成について言うためにこれを有する

  1. デフォルトポリシーは、ほぼ均一に分布している未使用IDのランダムシーケンスを生成します。各IDは、最大16桁の数字( )を使用できます。

  2. レガシーポリシーは、連続していない小さい整数IDのシーケンスを作成します。

ユーザーにエンティティIDを表示する、および/または その順序に依存している場合、行うための最善のことは、手動割り当てを使用しています。

と、この(2):

注:代わりに、キー名の文字列を使用したり、自動的に数値ID を生成する、高度なアプリケーションは時々エンティティに手動で 、独自の数値IDを割り当てることが彼ら作成します。 ただし、Cloud Datastoreの から、手動数値IDの1つを別のエンティティに割り当てることはできません。このような競合を避けるための唯一の の方法は、アプリケーションにdatastore.AllocateIDs関数のブロック のIDを取得させることです。 Cloud Datastoreの 自動IDジェネレータは、この機能を使用して に割り当てられたIDを追跡し、別のエンティティに再利用することはありません。したがって、 このIDを安全に矛盾なく使用できます。

この(3):

クラウドデータストア がほぼ均一に分布している未使用のIDのランダムシーケンスを生成します。各IDは、最大16桁の 桁までです。

システム割り当てのID値は、エンティティグループ固有のものであることが保証されています。 あるエンティティグループまたは名前空間のエンティティを別の にコピーして、そのキーのID部分を保持したい場合は、先に のIDを選択しないように、最初に IDを割り当ててCloud DatastoreがIDを選択しないようにしてください。

私は祖先に格納されている特定のエンティティタイプを持っています。しかし、グローバルユニークなIDとAEのID(によって割り当てられたdatastore.AllocateIDsGo)は、祖先(エンティティグループ内)に格納されたときにグローバルに一意ではありません。だから、事前配分はこれを解決するだろう(彼らは祖先にとらわれない)。しかし、あなたは明らかに応答で間隔を与えられています...予約されているIDの連続した範囲です。

これらの素晴らしい、不透明な、均一に分散されたIDを事前に割り当てる方法はありませんか?

AEの不透明IDは、エンティティタイプごとに持続状態のある擬似乱数生成器の結果であると仮定しましたが、(2 )は、使用されないかもしれないIDを楽観的に生成し、バッファリングするコストがあることを暗示しているようです。誰かがこれを明らかにすることができれば素晴らしいことだ。

+0

あなたの質問を言い換えたり、明確にすることはできますか?そこには多くの付帯的な情報があり、あなたの探しているものを正確に判断することは難しいと感じましたか? –

+0

タイトルと質問以外のすべてを太字で削除しても、 –

+0

本当にありません。何を達成しようとしているのですか?なぜ、それらがグローバルにユニークである必要があるのですか(キー全体がユニークであることを保証する現在の自動IDではなく、IDだけではありません)。一般的には、GUIDは事前割当を必要としないため(実際にはできません)、自動割り当てされたIDの衝突が本当に心配ですか?言い換えれば、なぜあなた自身のID *と*の自動IDを使用することに心配しているのでしょうか?おそらく両方を同時に使用すべきではありません。 –

答えて

0

簡単な解決策は、次の操作を行うことです。

エンティティのための新しいIDを割り当てしようとしている:以下

リピート:

  • ランダムKビット整数を生成します。エンティティIDフィールドに使用します。 [均一なランダム分布を使用]
  • Cloud Datastoreトランザクションを作成します。
  • 新しいエンティティを挿入します。 [エンティティが既に存在するためにトランザクションが異常終了した場合は、新しい乱数で再度試行してください]

あなたが(例えば、128のための)十分な大きKを作成し、適切に乱数ジェネレータを接種している場合、IDの衝突を発生させるために、あなたが再試行ループを削除することができ、統計的には不可能です。

Kを大きくするとエンティティキーの整数IDフィールドを使用するのを止めて、代わりに文字列1を使用します。 Base64 URLは乱数を文字列でエンコードします。

関連する問題