DBスキーマから自動でDBドキュメントを生成するツールをご紹介

# はじめに

チーム開発において、データベースのドキュメント（テーブル一覧、テーブル詳細、E-R図など）は、多くのプロジェクトで欠かせないものだと思います。
しかし、正直なところ、これらのドキュメントを手作業で作成・更新するのは面倒で、つらいと感じることもあるのではないでしょうか。

私自身も過去に、ExcelやConfluenceでDBドキュメントを管理していた経験がありますが、以下のような課題を感じていました。
- **ドキュメント作成・更新に時間がかかる**
- レビュー工程があっても**更新ミスや漏れが発生**してしまう
- **実際のDBとドキュメントが乖離**し、やがて参照されなくなってしまう

そこで今回は、これらの課題を解決するために「**接続しているDBのスキーマを解析し、DBドキュメントを自動生成する**」リバースエンジニアリングツールを2つ紹介します。
これらのツールを活用することで、上記の課題を解消し、より効率的にドキュメントを管理できます。

# ツール紹介

## Schemaspy
SchemaSpyはJava製のツールで、JDBCを使用してデータベースに接続し、スキーマ情報を解析して**HTML形式のDBドキュメント**を生成します。

https://schemaspy.org/

### 主な特徴
- テーブル一覧、テーブル詳細情報（カラム、インデックス）、E-R図などを**HTML形式で視覚的に表示**
- MySQL、MariaDB、Oracle、PostgreSQL、SQL Server などの多くのDBMSをサポート
- Dockerイメージが提供されており、気軽に試せる
    - https://hub.docker.com/r/schemaspy/schemaspy/

[公式サイトのサンプル](https://schemaspy.org/samples/epivirusurf/)では、SchemaSpyによって自動生成されるDBドキュメントの例を見ることができます。以下に一部を掲載します。

![テーブル一覧](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650582/36b24d9c-19b4-eb6a-a266-7ebd33dfe704.png)
*テーブル一覧*


![テーブル詳細](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650582/f1f361a9-d18a-93a4-cf26-a77042215270.png)![テーブル詳細](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650582/d46934ac-7830-2773-22ec-26630359430b.png)
*テーブル詳細*

![E-R図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650582/9b963c25-f535-f12a-bc75-e2204027eeb7.png)
*E-R図*

## tbls
tblsはGo製の軽量ツールで、SchemaSpyと同様に接続先のDBスキーマ情報を解析して、ドキュメントを生成します。

https://github.com/k1LoW/tbls

### 主な特徴
- **DBドキュメントの出力形式が豊富**
    - [GMF](https://github.github.com/gfm/)形式をはじめ、DOT、PlantUML、Mermaid、Image(svg, png, jpg)、JSON、YAML、Excelなどといった様々な形式で出力が可能
- **シングルバイナリ形式**で提供されるため導入が簡単で、CIに組み込みやすい
    - GitHubリポジトリからバイナリをダウンロードするだけで利用可能
- **データベースのリント機能**も提供
    - カラムコメントやテーブルコメントの必須化など実現できる
- SchemaSpyと同様、幅広いDBMSに対応
- Dockerイメージも提供
    - https://hub.docker.com/r/k1low/tbls


こちらについても、実際にどのような出力がされるのか[公式サンプル出力](https://github.com/k1LoW/tbls/blob/main/sample/postgres/README.md)を確認してみましょう。


![テーブル一覧](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650582/df7726b1-c409-5c6f-fcf7-dc862fe87a27.png)
*テーブル一覧*

![テーブル詳細](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650582/9324a5e4-5e69-3bb7-fa89-238dd94bc1f7.png)
![テーブル詳細](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650582/7769c756-c30a-519e-b64c-81956b9ef475.png)
*テーブル詳細*

![E-R図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650582/2b87d3c4-6525-9b8b-37e0-d40dde354abc.png)
*E-R図*

## ツール比較
Schemaspyとtblsの主な特徴を簡単に比較すると以下の通りだと思います。

| 特徴                | SchemaSpy                            | tbls                                   |
|---------------------|-------------------------------------|----------------------------------------|
| 言語               | Java                                | Go                                     |
| 出力形式           | HTML形式                           | 多様（Markdown、SVG、JSONなど）        |
| 導入方法       | Dockerイメージ、JAR               | シングルバイナリ、Dockerイメージ                 |
| リント機能         | ✗                                   | ◯（コメント必須化など）               |
| CIへの組み込み    | ◯                                  | ◎                                     |

GitHubリポジトリからバイナリをダウンロードするだけで利用できるので、tblsの方が導入は簡単かと思います。CIに組み込む際も、[k1low/setup-tbls](https://github.com/k1LoW/setup-tbls) を利用すれば簡単にセットアップできます。
一方、SchemaSpyは視覚的なデザインが優れており、特にE-R図が見やすいという特徴があります。

# CIに組み込んで使うとより便利

前述のツールはどちらもローカルで手動実行するだけでも便利ですが、CI（継続的インテグレーション）に組み込むことで、さらに効果を発揮します。
具体的には、次のような手順をイメージしています。

```sh
1. 特定のブランチへのコミットをトリガーに処理開始
2. DDL/DMLの変更差分を確認。差分がなければ処理を終了
3. DBマイグレーションを実行
4. SchemaSpy または tbls を利用してDBドキュメントを生成
5. 生成したDBドキュメントをS3などの静的ホスティング環境にアップロード
```

この流れを実現することで、DBドキュメントの最新状態をチーム全体で簡単に共有できます。手作業でドキュメント作成を行う際に発生していた更新ミスや漏れもなくなり、信頼できるドキュメントを自動的に生成できます。
具体的な実装例については、以下の記事が参考になります。

https://zenn.dev/shuhei_takada/articles/ecb030e6529fee

https://devblog.thebase.in/entry/auto_generated_er_graph_by_tbls_and_github_actions