背景
PlantUMLはコードで設計図を描くことができて非常に便利なんですが、ER図はサポートしていません。
ということで、コードからER図を生成する方法を探してみました。
今回使うもの
BurntSushi/erd
Haskellで作られたER図生成ツールです。PlantUMLのようにGraphvizで図を生成してくれるそうです。
インストール
こちらとこちらの記事を参考にさせていただきました。
Haskellにはcabal
とstack
というビルドツールがあるそうです。
stackの方が新しいということなのでそちらを使いました。(正確には、stackはcabalのラッパーツールだそうです)
$ brew reinstall graphviz --with-pango
$ brew install haskell-stack
$ git clone git://github.com/BurntSushi/erd
$ cd erd
$ stack init
$ stack build
気軽に使おうとしましたが、GHCのインストールがはじまって160MBくらいのファイルダウンロードが始まったので、ちょっと導入に抵抗を感じました。
あと、公式のREADMEにかかれている
cabal install erd
のようなインストールは、依存性の問題が解決できないため使えませんでした。
使ってみる
まずはサンプルを生成してみます。.er
がER図の生成元です。
$ stack exec erd -- -i examples/simple.er -o simple.png
主キーを表す下線の描画等がうまくいかない問題があったようですが、現在は解決しているようです。
マルチバイトを使った状態でも問題なく描画できました。
.er
ファイルの書き方
エンティティ
[Person]
[ ]で囲うことでエンティティを表現します。
属性
[Person]
*id
+name
age
エンティティの下に、そのエンティティの属性を書くことができます。
*
で主キー、+
で外部キーを表現できます。
リレーション
Person *--1 Location
エンティティ間を、カーディナリティと --
でつなぐことでリレーションを表現します。
使えるカーディナリティは以下の様になっています。
Cardinality Syntax
0 or 1 ?
exactly 1 1
0 or more *
1 or more +
1以外の数字をカーディナリティとして使うことはできないようです。(使う機会はないと思いますが…)
カーディナリティ同士をつなぐ--
も固定で、---
だったりすると変換で弾かれてしまいます。
gulpで変更監視させてみる
Atomのplantuml-viewerみたいに、変更監視してコマンド叩いてくれるものが欲しいなと思ったので、gulpを使って手軽に済ませてみました。
childprocess
使って無理やりコマンドを叩く泥臭い出来上がりなのでいつかちゃんとしたAtomプラグインを作りたいです。
まとめ
参考にさせていただいた記事のほうでも書かれていましたが、導入が少し面倒という感じがしました。
dockerizeしてしまったほうがよかったかなーと今更思っています。
ER図を書くという観点では、
エンティティとリレーションを分けて書くので、頭の中も整理しやすく結構書きやすいのではないでしょうか。