ER図を手書きするのはもうやめよう:SchemaSpyとdbdocsでデータベースドキュメントを自動化する方法

Database tutorial - IT technology blog
Database tutorial - IT technology blog

失われた地図:250以上のテーブルを盲目的にナビゲートする

2021年当時、私はフィンテック系のスタートアップに参画しました。最初のタスクは、失敗している取引レポートのデバッグでした。本番データベースにログインした瞬間、私は強い不安に襲われました。そこには264ものテーブルがあり、その多くは txn_log_v2_final_final のような不可解な名前で、ドキュメントは一切ありませんでした。リードエンジニアにER図(実体関連図)があるか尋ねると、共有フォルダ内にある40ページのPDFを指さされました。それは2014年以降、一度も更新されていませんでした。

私はMySQLやPostgreSQLからMongoDBまで、あらゆるデータベースを扱ってきました。どのプロジェクトにも独自の癖がありますが、共通する致命的な欠陥が一つあります。それは「スキーマの変化は速い」ということです。手動のドキュメントは、誰かが git push を実行した瞬間に過去の遺物となります。火曜日の午後を丸々潰してLucidchartで箱を描くのは、エンジニアの貴重な時間の使い方としては賢明ではありません。データベース自身にその構造を説明させるツールが必要です。

ドキュメントの腐敗:なぜ手動の取り組みは失敗するのか

質の低いドキュメントは、大抵の場合、怠慢から生まれるのではなく「摩擦」から生まれます。週に3回コードをデプロイしているような環境では、手動で図を更新し続けることは不可能な負担となります。従来の管理手法が崩壊する理由は以下の通りです:

  • 同期のずれ: 外部キーを一つ変更しただけで、静的な図面は嘘の情報になります。
  • 暗黙知(属人化): 2019年の移行の影響で、ordersテーブルのuser_idが実際にはlegacy_customersに紐付いていることを知っているのは、「古参」のエンジニアだけです。
  • アクセシビリティ: ER図は、特定のライセンスが必要な独自の .vsdx ファイルの中で放置されがちです。その結果、プロダクトマネージャーやQA担当者が情報を確認できなくなります。

リレーションシップの把握漏れは、不適切なクエリやデータ整合性のバグを引き起こします。オンボーディングには数日ではなく数週間かかるようになります。ドキュメントはコードと同様に、自動化され、バージョン管理され、視覚化されたものとして扱うべきです。

有力候補の比較:SchemaSpy vs. dbdocs

私は何十ものツールをテストしてきましたが、2つのツールが明確な勝者として浮上しました。これらは異なる角度から問題を解決します。スタックによっては、両方を同時に使用することもあります。

1. SchemaSpy:深掘りエクスプローラー

SchemaSpyはJavaベースの強力なツールです。データベースのメタデータを分析し、検索可能なインタラクティブなHTMLサイトを生成します。テクニカル監査に最適です。制約やインデックスを深く分析し、リレーションのない「孤立した」テーブルまで特定してくれます。

メリット:

  • ローカルまたはCI/CDパイプラインで直接実行可能。
  • 非常に詳細なインタラクティブ図面を生成。
  • 主キーが欠落しているテーブルなどの異常を検出。
  • データがネットワーク外に出ないため、セキュリティに敏感なプロジェクトに不可欠。

2. dbdocs:モダンなコラボレーター

洗練された共有可能なドキュメントが必要なら、dbdocs.ioを使いましょう。.dbml(Database Markup Language)ファイルを取り込み、高パフォーマンスなドキュメントサイトに変換します。コラボレーションを前提に設計されており、ドキュメントをパスワード保護したり、ライブURLをチーム全体に数秒で共有したりできます。

メリット:

  • 驚くほど高速で視覚的に洗練されている。
  • グローバル検索機能を内蔵。
  • バージョン履歴をサポート。
  • SQLからDBMLへのコンバーターと簡単に連携。

SchemaSpyの実装:データベースの内部を可視化する

私はJavaの依存関係やJDBCドライバの管理という煩わしさを避けるため、DockerでSchemaSpyを実行しています。PostgreSQLデータベースの完全なレポートを生成するコマンドは以下の通りです:

docker run -v "$(pwd)/output:/output" --net="host" schemaspy/schemaspy:6.1.0 \
  -t pgsql \
  -host localhost:5432 \
  -db my_app_db \
  -u postgres \
  -p mypassword \
  -s public

コンテナの実行が終わったら、ブラウザで output/index.html を開いてください。「Relationships」タブには、すべての外部キーの接続が表示されます。私のお気に入りの機能は「Degree of Separation(分離次数)」フィルタです。特定のテーブルに焦点を当て、その直接の隣接テーブルだけを表示できるため、300テーブル規模の巨大なモノリスをナビゲートする際の救世主となります。

dbdocsの実装:Documentation as Code

dbdocsのワークフローは少し異なります。まず、@dbml/cli を使用してスキーマをDBMLファイルに抽出します。その後、それをクラウドにプッシュします。

まず、ツールをインストールします:

npm install -g @dbml/cli dbdocs

次に、スキーマをエクスポートして公開します:

# SQLをDBMLにエクスポート
sql2dbml dump_schema.sql --postgres -o schema.dbml

# dbdocsへプッシュ
dbdocs build schema.dbml --project billing-service

これにより、dbdocs.io/myteam/billing-service のようなクリーンなURLが生成されます。私は通常、これをGitHub Actionsに組み込んでいます。これにより、マイグレーションmain ブランチにマージされるたびに、ドキュメントが即座に更新されます。Slackで「この図は最新ですか?」という質問が出ることはもうありません。

戦略:ハイブリッドアプローチ

最も効果的なチームは、これら2つのツールを戦略的に併用しています。パフォーマンスのボトルネックやインデックスの不備を探す必要があるDBAやバックエンドエンジニア向けには、SchemaSpy を導入します。これらのレポートは、VPN配下の社内Nginxサーバーでホストします。

それ以外の人々(フロントエンドエンジニア、データアナリスト、プロダクトオーナー)には、dbdocs を使用します。フロントエンドエンジニアにとって、複雑なテクニカル監査資料を漁るよりも、dbdocs でフィールドを検索する方がはるかに高速だからです。

これを自動化することで、ドキュメント作成は「面倒な作業」から「開発の副産物」へと変わります。新人が加わったとき、肩をすくめて2014年のPDFを渡すのではなく、データ帝国のライブでインタラクティブな地図を渡しましょう。それこそが、正気を保ちながら技術チームをスケールさせる方法です。

Share: