作ったアプリからリバースエンジニアよろしくDB設計書を自動生成したい。生成されるファイルの形式やフォーマットは不問(第三者が前知識なしに必要な情報を得られれればOK)。
前置き
ところで「何でDB設計書がないのか?」というと、正確には、最初からなかったわけではない。最初はあったけど、頻繁に変更されるスキーマに設計書が追随できなくなってしまい、放置されてしてしまったのである。
設計書と実際が対応しないことはよくある…のかな…。システム開発において、間違っている設計書ほど害はないよね。だったらないほうがマシだよというわけ。
DBはPostgreSQL 9.1、O/RマッパーはDomaってのを使っている。
「DB設計書がなくて問題ないのか?」というと、ぶっちゃけそんなに不自由がなかった。少人数開発だからかもしれないけど、そもそも実際にアプリを動かすのに必要なのは、スキーマがちゃんと定義されているDBと、Domaが利用するいくつかのファイル(エンティティクラスとか)であって、DB設計書ではないのだから。
検討する
今、開発したアプリケーションの成果物の一部として、バージョン管理されているスキーマ作成用のDDLと、エンティティクラスやドメインクラスがある(ドメインクラスというのはDomaの方言的なところもあるので、必要であれば公式ドキュメントを参照してください)。
こいつらからDB設計書が機械的に生成できれば、ミッションコンプリート。
さて、Domaを使うために作成するJavaファイル(エンティティクラス)には、外部キーに関する設定がない(もちろんドメインクラスとかその他諸々にも)。
仕組み的に外部キーをO/Rマッパーとして必要としていないのである。結合した結果を取得するようなSQLが必要な場合、その分だけのSQLファイルを用意しないとならないんだけど、今のアプリはそこまでスキーマが複雑でなく、検索用SQLも数が少ないので、非常に相性よく使えたのだ。
まぁそんなわけで、実行には問題は全くないのだけど、スキーマ定義書を作るためには情報が足りない。
Domaには、Doma-Genというスキーマからエンティティクラスを自動生成する開発支援ツールが提供されていて、これと似た形でできないものか。
足りない制約等の情報は新しくアノテーションを作って補おう。
生成は自動ビルドの一環で行うから、手段としてはAntでできれば必要十分。
候補1: ER Master
ER MasterっていうEclipse Pluginがいいのかなぁ(スキーマからインポートして、必要なフォーマットでエクスポート)。うーん。これだと、必要な時に手動で生成しないとならないのと、テーブルやカラムに対する説明を出力できないよなぁ。
候補2: SchemaSpy
(公式)http://schemaspy.sourceforge.net/
http://www.syboos.jp/oss/doc/schemaspy.html
これはよさそうだ。もうちょい詳しく調べてみよう。
5/23 追記
結果としてとりあえずSchemaSpyに落ち着いた。JenkinsのDependency Graph View Pluginを入れていたおかげで、Graphvizもインストール済みだったので、より楽だった。
テーブルやカラムに対するコメントなどのメタ情報は、XMLファイルで定義して読み込ませることができる。なので、必要に迫られたら、エンティティクラスからそのXMLファイルを自動生成できるようにしよう。