0

一部のデータをMySqlからDatastoreに移行しようとしています。私は、自動増分主キー(Bigint(20))を持つUserというテーブルを持っています。今私はUserテーブルからデータストアにデータを移動したいと思います。自動増分IDを使用してMySQLからGoogle Datastoreにデータを移行しますか?

私の計画では、移行が完了した後に作成されたすべての新規ユーザーと移行ユーザーの新しいIDがDatastoreによって生成されました。ただし、古いIDに依存する多くのサービス(通知、URLなど)があります。ですから、移行したユーザーに古いIDを使用したいのですが、新しく生成されたすべてのIDが移行されたIDと衝突しないことをどうすれば保証できますか?

+0

約1000。 – danielz

+0

申し訳ありませんダニー、私はあなたの質問を誤解しました。ジェフリーはあなたに正しい答えを得ました。 – feroult

答えて

1

移行する前に、最大および最小IDを記録してください。すべてのsql行をデータストア・エンティティに移行し、entity.key.id = sql.row.idを設定します。

新しいデータストアIDが古いものと衝突するのを防ぐには、常にAllocateIds()を呼び出して新しいIDを割り当てます。 C#では、コードは次のようになります。実際には

 Key key; 
     Key incompleteKey = _db.CreateKeyFactory("Task").CreateIncompleteKey(); 
     do 
     { 
      key = _db.AllocateId(incompleteKey); 
     } while (key.Path[0].Id >= minOldId && key.Path[0].Id <= maxOldId); 
     // Use new key for new entity. 

、キー衝突を見ることよりも、宝くじを獲得する可能性が高いので、古いIDの範囲に対してチェックするよりは何も費用は一切かかりません。

+1

これはうまくいくかもしれませんが、ID割り当てにはDatastoreへの往復が必要ですが、これは不要です。エンティティを作成する最も速い方法は、追加/挿入操作のために不完全キーを持つエンティティを送信することです。 –

+0

それは本当です。新しいエンティティごとに往復を避けるために、100個のIDを一度に割り当てて、それを1つずつ使用することができます。 –

0

特定のIDを予約するようにDatastoreに指示することはできません。したがって、既存のデータを挿入するときに手動でIDを設定し、後でデータストアにIDを割り当てさせると、既に使用したIDが選択されます。使用している操作(INSERTやUPSERTなど)によっては、操作が失敗したり既存のエンティティを上書きしたりすることがあります。

既存のIDをデータストアIDにマップするための移行計画を策定する必要があります。あなたが持っているテーブルの数とそれらの間の関係の複雑さによっては、これは時間のかかるプロジェクトになるかもしれませんが、それでもやることができます。

簡単な例を取ると、あなたは2つのテーブルを持っていると仮定しましょう:

USER(USER_IDは主キーです) USER_DATA(USER_IDが外部キーである)

あなたはおそらく、ユーザーに別の列を追加します(または、別の可能性USER_IDをDATASTORE_IDにマップします。ここでは、使用する種類のデータストアのallocateIDメソッドを呼び出し、返されたIDを新しい列に格納します。

これで、MySQLデータのUser IDを無視して、新しいデータのIDを使用する代わりに、USERデータをCloud Datastoreに移動できます。

USER_DATAからデータを移行するには、2つのテーブル間で結合を行い、データストアIDを使用してデータをプッシュします。

また、シーケンシャルID(単調増加値と呼ばれる)を使用すると、Datastoreのパフォーマンスに問題が発生する可能性があります。したがって、データストアによって生成されたIDを使用したいと思うかもしれません。

関連する問題