MongoDB から Postgres への移行
アプリケーションを MongoDB から Postgres に移行します。ドキュメントスキーマをリレーショナルテーブルに変換し、クエリを Postgres クライアントを使うように書き換え、データを移行します。Postgres スキーマの設計
MongoDB コレクションを分析し、対応するリレーショナルスキーマを設計します。データが複数のコレクション間の関連を伴う場合は、SQL を書き始める前に、まずエンティティ・リレーションシップ図 (ERD) を作成して、正規化方針を検証してください。主な変換パターンは次のとおりです:
- Document IDs: MongoDB の
_idフィールドを UUID または SERIAL 型の主キーに変換する - Nested objects: 別テーブルに分割し、外部キーで関連付ける
- Arrays: Postgres の配列型、または中間 (ジャンクション) テーブルを使用する
- Embedded documents: 正規化に沿って別の関連テーブルとして切り出す
バックエンドのクエリおよび依存関係を移行する
MongoDB ドライバ(例:
mongoose, mongodb)を、スタックに応じて Prisma、Drizzle、TypeORM、または node-postgres などの Postgres クライアントライブラリに置き換えます。環境設定で DATABASE_URL などの接続情報を更新してください。クエリ移行のパターン:- Find operations → SQL の
SELECTクエリ、または ORM の.findMany()/.select() - Aggregation pipelines →
JOIN、GROUP BY、サブクエリ、ウィンドウ関数 - Updates → SQL の
UPDATE文 - Inserts → SQL の
INSERTまたはバルクインサートメソッド
フロントエンドのサービス層を更新する
マイグレーションによるデータ形式の変更(もっとも一般的なのは
_id が id になるケース)に対応できるよう、フロントエンドサービスを更新します。既存のサービスメソッドのシグネチャは維持し、コンポーネント側に変更が不要なようにします。- 認証フローが変わった場合は、認証サービスを更新する
- 新しいデータ形式に合わせて HTTP クライアントのリクエスト/レスポンス処理を調整する
- データ取得パターンが変わった場合は、ルートガードやリゾルバを更新する
データの移行とエンドツーエンドテストの実行
MongoDB のデータをエクスポートし、Postgres のスキーマに合わせて変換してからインポートします。インポート後、Postgres バックエンドに対してフルテストスイートを実行します。すべての CRUD 操作、認証フロー、ロールベースのアクセス制御が正しく動作することを確認します。
デプロイと最適化
機能フラグを使って段階的にデプロイします。移行期間中は MongoDB インスタンスをフォールバックとして維持してください。デプロイ後チェックリスト:
- 頻繁にクエリされるカラムにインデックスを追加する
EXPLAIN ANALYZEを使用して遅いクエリを特定する- 接続プーリング(例: PgBouncer)をセットアップする
- クエリパフォーマンスと接続利用状況を監視する
- 重大な問題が発生した場合のロールバック手順を文書化する
プレイブック化して再現可能にする
この移行パターンを複数のサービスやリポジトリで実行する必要がある場合は、プレイブックとして保存しておくと、すべてのセッションで同じプロセスを実行できます。以下は、MongoDB から Postgres への移行に関するプレイブックの例です。
