(tldr;定期的な更新により、テーブルは自然キーを使用するように強制されると思います。そのため、データベーススキーマを移行する必要があります。)
私は、 Planets のようなテーブルを持つ実稼働データベースを持っています。これは、潜在的な自然キー (実際には決して変化しない惑星名など) を持っていますが、典型的なインクリメントされた整数を主キーとして使用します。惑星テーブルには、*parent_planet_id* などの自己参照列が 1 つまたは 2 つあります。
現在、毎週惑星レコードのサブセットを再作成するオフラインのクラウドベースのワーカーを構築しており、メイン サーバーと統合する必要があります。私の計画は次のとおりです。
- ワーカー インスタンスにはミニ バージョンのデータベースがあります (スキーマは同じですが、Planets レコードはありません)。
- 週に 1 回、ワーカーが起動し、すべての処理を行い、約 100,000 の惑星レコードを作成し、データをエクスポートします。(この特定の問題では、エクスポート形式は重要ではないと思います。mysqldump、yamlなどである可能性があります。)
- 次に、運用サーバーがレコードをインポートします。一部は新しいレコードで、ほとんどは更新されています。
この最後のステップは、解決方法がわからないものです。私は毎回 Planets テーブルを完全に置き換えているわけではないので、問題は 2 つのデータベースがそれぞれ独自のインクリメント整数 PK を持っていることです。そのため、単純なインポートを行うことはできません。
id 列なしでエクスポートすることを考えましたが、自己参照列がこれを妨げていることに気付きました。
考えられる解決策は 2 つあります。
- スキーマを再設計して、planets テーブルに自然キーを使用します。これは苦痛でしょう。
- キーの増分整数の代わりに UUID を使用します。移動するのは簡単だと思います。ID は一意であり、新しい行は安全にインポートできます。これにより、キーの自然なデータに依存する問題も回避されます。