PlantUML で ER 図を描く（似非）

[PlantUMLのクラス図](http://plantuml.com/class-diagram)を使って __無理矢理__ ER図を作ります。オススメはしません。自分の備忘録・チートシートです。タイトルを「PlantUML で ER 図を描く」にしてしまうと怒られそうなので「似非」を入れました。

## 追記：2017/07/27

バージョン 1.2017.08 が「2017年の08月にリリースが予定されているバージョン」と勘違いしてしまいました↓。「2017年の８回目のリリース」のようで、既に３月に出ています。

[こちら](https://github.com/plantuml/plantuml/pull/31) の冒頭のコードがエラーになったので未サポートだと思っていました。投稿の流れを全部読んだら「カーディナリティは最終的に『>o--o<』じゃなくて『}o--o{』で書けるようにします」との記述がありました。サンプルのコードを、そのように直すと、ちゃんと鳥足が描画されました。

現在のバージョンは 1.2017.15 です。

[新しい記事](http://qiita.com/Tachy_Pochy/items/752ef6e3d38e970378f0
)に書き直しましたので、そちらをご覧ください。

## 追記

2017年 8月リリース予定の新しいバージョンで ER 図に対応するようです。
@shida さんコメントありがとうございます。

以下、2017年 2月の投稿です。

## はじめに

かつては[A5:SQL Mk-2](http://a5m2.mmatsubara.com)のER図機能を使っていて、その出力ファイルはテキストだったので、同じく Git などでバージョン管理出来るメリットがあったのですが、Mac 版がないのは厳しく...。

テキストベースでER図を描けるメリットは...

- ファイルが軽い。
- Git などでバージョン管理しやすい。
- （プログラマは往々にしてドキュメントを作るのが嫌いだが）プログラム組んでいるようで楽しく作れる（モチベーションは大事だよね）。

...などがあります。

[PlantUML](http://plantuml.com/class-diagram)ではER図を（まだ）サポートしていません。テキストベースでは他にも[Graphviz（Dot言語）](http://www.graphviz.org/Gallery.php)や、そのままズバリ[ERD（BurntSushi/erd）](http://qiita.com/nori3tsu/items/c36591b8091e9ff89ce5)という選択肢があるのですが以下の理由で[PlantUMLのクラス図](http://plantuml.com/class-diagram)を使っています。

- メインドライブの容量が枯渇し、あまり多くのツールを入れたくない。
- セットアップが多いと __布教する時につらい__ 。
- 思ったより良かった。

## 参考

ER図そのものについては下記のサイトが詳しいです。
[ER図 （Entity Relationship Diagram）](http://itref.fc2web.com/technology/entity_relationship_diagram.html)

また、書き方については下記の書籍が詳しいです。オススメです。
[楽々ERDレッスン](http://www.shoeisha.co.jp/book/detail/9784798110660)

## サンプル

下記のページからテーブル構成を参考にしました。
[若手プログラマー必読！５分で理解できるER図の書き方５ステップ](http://it-koala.com/entity-relationship-diagram-1897)



```puml:サンプル
@startuml

package "外部データベース" as ext <<Database>> {
    Class "顧客マスタ" as customer <<M,AAFFAA)>> {
       +顧客ID [PK]
        ---
        顧客名
        郵便番号
        住所
        電話番号
        FAX
    }
}

package "開発対象システム" as target_system {
	/'
	  マスターテーブルを M、トランザクションを T などと安直にしていますが、
	  チーム内でルールを決めればなんでも良いと思います。交差テーブルは "I" とか。
	  角丸四角形が描けない代替です。
	  １文字なら "主" とか "従" とか日本語でも OK だったのが受ける。
	 '/
    Class "注文テーブル" as order <<主,FFAA00)>> {
       +注文ID [PK]
        ---
       #顧客ID [FK]
        注文日時
        配送希望日
        配送方法
        お届け先名
        お届け先住所
        決済方法
        合計金額
        消費税額
    }

    Class "注文明細テーブル" as order_detail <<T,FFAA00)>> {
       +注文ID   [PK]
       +明細番号 [PK]
        ---
       #SKU [FK]
        注文数
        税抜価格
        税込価格
    }

    Class "SKUマスタ" as sku <<M,AAFFAA)>> {
       +SKU [PK]
        ---
       #商品ID [FK]
        カラー
        サイズ
        重量
        販売単価
        仕入単価
    }

    Class "商品マスタ" as product <<M,AAFFAA)>> {
       +商品ID [PK]
        ---
        商品名
        原産国
       #仕入先ID [FK]
        商品カテゴリ
        配送必要日数
    }

    Class "仕入先マスタ" as vendor <<M,AAFFAA)>> {
       +仕入先ID [PK]
        ---
        仕入れ先名
        郵便番号
        住所
        電話番号
        FAX番号
    }
}

customer      "0,1"--ri--"0..*"     order
order           "1"--ri--"1..*"     order_detail
order_detail    "*" -do- "1"        sku
sku             "*"--le--"1"        product
product      "0..*"--le--"1"        vendor


@enduml

```

## 結果
![plantuml_erd.png](https://qiita-image-store.s3.amazonaws.com/0/37554/3e9fc9ac-2c60-bc56-04bd-02eee167ace1.png)

## その他

本当はカーディナリティはこんな風に書きたい。

```
   ------ :1
   -----+ :1
   ----++ :1 and only 1
   ----+0 :0 or 1
   -----{ :many
   ----+{ :1 or more
   ----0{ :0 or many
```