0

タイトルがわかりにくいかもしれませんが、質問を説明するのに最適なタイトルです。

バックグラウンド:

ドメインがあり、ドメインには 2 つのデータベースがあります。1 つは nosql (Mongodb) で、もう 1 つは sql (Postgres) です。各データベースにはモデルがあります。たとえば、ドメイン名が「myapp」でバージョンが「v01」の場合、sql と nosql の両方に「myapp_v01」という名前のデータベースがあります。

移行 - データベースのコピー:

移行するときは、通常、この「myapp_v02」のような名前の新しいデータベースを作成します (2 に注目してください)。次に、移行スクリプトはテーブルを複製するか、「myapp_v01」からデータを取得して何らかの方法で変更し、別の方法で「myapp_v02」に保存します。これが非常にスケーラブルかどうか、または移行に 1 時間かかる場合はどうなるかわかりません。

移行 - テーブルのコピー:

新しい一時テーブルを作成して、移行の変更を行うことができます (テーブル "cars" から "cars_temp" にコピーし、"cars" テーブルを削除して、"cars_temp" の名前を "cars" に変更します)。

移行 - テーブルの変更:

両方の SQL データベースがあるため、これは少し複雑です。SQLでは、まずスキーマを変更してから、必要に応じて各行を更新する必要があります。

結論: 3 番目が最速だと思いますが、ここでのベスト プラクティスが何であるかはよくわかりません。

ありがとう

4

1 に答える 1

1

私は3番目をデフォルトのアプローチと考えています。それには、いくつかの賛成論があります。

  1. 変わらないものに触れる必要はありません。そのままの場所にとどまるだけです。

  2. v1 で列を追加し、バージョン 1 の有効期間中にデータを入力し始め、おそらくバッチで、v2 で積極的に使用し、v3 で古い列を削除するなど、段階的な変更を簡単に行うことができます。新しいものはうまく機能しています。他のアプローチでそれを行うのは面倒に思えます。

  3. 大規模なデータベースでは、すべてのデータをコピーすると非常にコストがかかる可能性があります (ディスク容量よりも時間と I/O を考慮する必要があります)。

UPDATEコメントで追加の質問に答える

列 A と B を新しい列 C にマージする場合は、質問の 3 番目のアプローチに基づいてさまざまなオプションがあります。

安全な方法: - アプリケーションを停止して、誰も書き込めないようにします。

  • 列Cを作成して入力します

  • A と B の not null および同様の制約を削除する可能性があります

  • 列 C のみを使用する新しいバージョンのアプリケーションをデプロイして開始します。

  • 後でいつでも、列 A と B をドロップします。おそらく、数週間後に次のリリースが行われます。

簡単な方法 - アプリケーションを停止して、誰も書き込めないようにします。

  • 列Cを作成して入力します

  • AとBを落とす

  • 列 C のみを使用する新しいバージョンのアプリケーションをデプロイして開始します。

アプリケーションと未使用の列に問題があるように見えるので、これが良い方法かもしれません。

レガシー コードへの道 - 列 C を作成します (注: すべてのアプリはまだ実行中です)。

  • A、B、C の同期を維持するトリガーを作成します (これは、ビューやその他のベンダー固有の RDBMS 機能でも実行できます)

  • 列 C のみを使用する新しいバージョンのアプリケーションをデプロイして開始します。

  • 他のすべてのアプリケーションを C のみを使用するように移行する

  • 後でいつでも列AとBをドロップします。おそらく数年後です。

これは、一度にすべてを変更できないデータベースを使用する多くのアプリがある場合です。

私はマングースでの続編について何も知りません...私にはおとぎ話の冒険のように聞こえます:-)

于 2012-12-12T12:03:04.843 に答える