Skip to main content

MongoDB から Postgres への移行

アプリケーションを MongoDB から Postgres に移行します。ドキュメントスキーマをリレーショナルテーブルに変換し、クエリを Postgres クライアントを使うように書き換え、データを移行します。
AuthorCognition
Categoryマイグレーション
FeaturesPlaybooks
1

Postgres スキーマの設計

MongoDB コレクションを分析し、対応するリレーショナルスキーマを設計します。データが複数のコレクション間の関連を伴う場合は、SQL を書き始める前に、まずエンティティ・リレーションシップ図 (ERD) を作成して、正規化方針を検証してください。主な変換パターンは次のとおりです:
  • Document IDs: MongoDB の _id フィールドを UUID または SERIAL 型の主キーに変換する
  • Nested objects: 別テーブルに分割し、外部キーで関連付ける
  • Arrays: Postgres の配列型、または中間 (ジャンクション) テーブルを使用する
  • Embedded documents: 正規化に沿って別の関連テーブルとして切り出す
スキーマの設計ができたら、セキュリティを設定します。適切な権限を持つ Postgres ロールを作成し、行レベルのアクセス制御が必要なテーブルに対して Row-Level Security (RLS) ポリシーを有効化します。
2

バックエンドのクエリおよび依存関係を移行する

MongoDB ドライバ(例: mongoose, mongodb)を、スタックに応じて Prisma、Drizzle、TypeORM、または node-postgres などの Postgres クライアントライブラリに置き換えます。環境設定で DATABASE_URL などの接続情報を更新してください。クエリ移行のパターン:
  • Find operations → SQL の SELECT クエリ、または ORM の .findMany() / .select()
  • Aggregation pipelinesJOINGROUP BY、サブクエリ、ウィンドウ関数
  • Updates → SQL の UPDATE
  • Inserts → SQL の INSERT またはバルクインサートメソッド
アプリが MongoDB のユーザーストアを使ったカスタム JWT 認証を利用している場合は、トークンの生成と検証ロジックはそのままに、ユーザー検索クエリだけを Postgres を使うように更新してください。
3

フロントエンドのサービス層を更新する

マイグレーションによるデータ形式の変更(もっとも一般的なのは _idid になるケース)に対応できるよう、フロントエンドサービスを更新します。既存のサービスメソッドのシグネチャは維持し、コンポーネント側に変更が不要なようにします。
  • 認証フローが変わった場合は、認証サービスを更新する
  • 新しいデータ形式に合わせて HTTP クライアントのリクエスト/レスポンス処理を調整する
  • データ取得パターンが変わった場合は、ルートガードやリゾルバを更新する
4

データの移行とエンドツーエンドテストの実行

MongoDB のデータをエクスポートし、Postgres のスキーマに合わせて変換してからインポートします。インポート後、Postgres バックエンドに対してフルテストスイートを実行します。すべての CRUD 操作、認証フロー、ロールベースのアクセス制御が正しく動作することを確認します。
5

デプロイと最適化

機能フラグを使って段階的にデプロイします。移行期間中は MongoDB インスタンスをフォールバックとして維持してください。デプロイ後チェックリスト:
  • 頻繁にクエリされるカラムにインデックスを追加する
  • EXPLAIN ANALYZE を使用して遅いクエリを特定する
  • 接続プーリング(例: PgBouncer)をセットアップする
  • クエリパフォーマンスと接続利用状況を監視する
  • 重大な問題が発生した場合のロールバック手順を文書化する
すべてが安定し検証できたら、MongoDB インスタンスを廃止します。
6

プレイブック化して再現可能にする

この移行パターンを複数のサービスやリポジトリで実行する必要がある場合は、プレイブックとして保存しておくと、すべてのセッションで同じプロセスを実行できます。以下は、MongoDB から Postgres への移行に関するプレイブックの例です。