読者です 読者をやめる 読者になる 読者になる

Domaで作ったエンティティクラスとDBスキーマからDB設計書を作りたい

Survey DB Java

作ったアプリからリバースエンジニアよろしく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

これはよさそうだ。もうちょい詳しく調べてみよう。

候補3: スキーマをそのままダンプ

pg_dumpに「-s」オプションを付けて実行。まぁこれはこれで必要かな。
ただ、人が見るにはちょっとばかり分かりにくいので、設計書とは言いがたい。

5/23 追記

結果としてとりあえずSchemaSpyに落ち着いた。JenkinsのDependency Graph View Pluginを入れていたおかげで、Graphvizもインストール済みだったので、より楽だった。

テーブルやカラムに対するコメントなどのメタ情報は、XMLファイルで定義して読み込ませることができる。なので、必要に迫られたら、エンティティクラスからそのXMLファイルを自動生成できるようにしよう。