erdでテキストベースにER図を描く

  • 15
    いいね
  • 0
    コメント

背景

PlantUMLはコードで設計図を描くことができて非常に便利なんですが、ER図はサポートしていません。
ということで、コードからER図を生成する方法を探してみました。

今回使うもの

BurntSushi/erd
Haskellで作られたER図生成ツールです。PlantUMLのようにGraphvizで図を生成してくれるそうです。

インストール

こちらこちらの記事を参考にさせていただきました。
Haskellにはcabalstackというビルドツールがあるそうです。
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

simple.png

主キーを表す下線の描画等がうまくいかない問題があったようですが、現在は解決しているようです。
マルチバイトを使った状態でも問題なく描画できました。
comp.png

.erファイルの書き方

エンティティ

[Person]

[ ]で囲うことでエンティティを表現します。

属性

[Person]
*id
+name
age

test.png

エンティティの下に、そのエンティティの属性を書くことができます。
*で主キー、+で外部キーを表現できます。

リレーション

Person *--1 Location

test.png

エンティティ間を、カーディナリティと --でつなぐことでリレーションを表現します。
使えるカーディナリティは以下の様になっています。

Cardinality    Syntax
0 or 1         ?
exactly 1      1
0 or more      *
1 or more      +

1以外の数字をカーディナリティとして使うことはできないようです。(使う機会はないと思いますが…)
カーディナリティ同士をつなぐ--も固定で、---だったりすると変換で弾かれてしまいます。

gulpで変更監視させてみる

erdwatch

Atomのplantuml-viewerみたいに、変更監視してコマンド叩いてくれるものが欲しいなと思ったので、gulpを使って手軽に済ませてみました。
childprocess使って無理やりコマンドを叩く泥臭い出来上がりなのでいつかちゃんとしたAtomプラグインを作りたいです。

まとめ

参考にさせていただいた記事のほうでも書かれていましたが、導入が少し面倒という感じがしました。
dockerizeしてしまったほうがよかったかなーと今更思っています。

ER図を書くという観点では、
エンティティとリレーションを分けて書くので、頭の中も整理しやすく結構書きやすいのではないでしょうか。

この投稿は Hamee Advent Calendar 201613日目の記事です。