PlantUML で ER 図（ERD）を描く（似非ではないです）

## はじめに

[PlantUML](http://plantuml.com/) ではバージョン 1.2017.08 から ER 図に対応しています。[^1]

以前の「 [PlantUML で ER 図を描く（似非） - Qiita](http://qiita.com/Tachy_Pochy/items/d074e6cbf2f5f4527fa7) 」の記事ではクラス図を流用しましたが、こちらの記事はそうではありません。

しかしどうやらクラス図のキーワード "class" に "entity" というエイリアスをかぶせて実現しているようで、クラス図とほとんど同じように書けます。[^2][^3]

## カーディナリティ

カーディナリティにはこんな種類があります。

```puml:カーディナリティ
    ------   :1
    ----||   :1 and only 1
    ----o|   :0 or 1
    -----{   :many
    ----|{   :1 or more
    ----o{   :0 or many

```
描画結果

![test.png](https://qiita-image-store.s3.amazonaws.com/0/37554/7a1282f6-4355-92a4-6209-fceb87c795fe.png)

このサンプルでは不要な水平線が入っています。この水平線はクラス図の「プロパティ（フィールド）」と「メソッド」を分ける「区切り線」ですが、`hide empty members` を最初に書いておくと非表示に出来ます。

参考：http://plantuml.com/class-diagram#Hide

## ER 図とは

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

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

## サンプル

[前回](http://qiita.com/Tachy_Pochy/items/d074e6cbf2f5f4527fa7) 同様、下記のページからテーブル構成を参考にして、PlantUML で ER 図を書いてみます。

[若手プログラマー必読！５分で理解できるER図の書き方５ステップ](http://it-koala.com/entity-relationship-diagram-1897)

```puml:サンプル
@startuml

/'
  図の中で目立たせたいエンティティに着色するための
  色の名前（定数）を定義します。
'/
!define MAIN_ENTITY #E2EFDA-C6E0B4
!define MAIN_ENTITY_2 #FCE4D6-F8CBAD

/' 他の色も、用途が分りやすいように名前をつけます。 '/
!define METAL #F2F2F2-D9D9D9
!define MASTER_MARK_COLOR AAFFAA
!define TRANSACTION_MARK_COLOR FFAA00

/'
  デフォルトのスタイルを設定します。
  この場合の指定は class です。entity ではエラーになります。
'/
skinparam class {
    BackgroundColor METAL
    BorderColor Black
    ArrowColor Black
}

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

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

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

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

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

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

customer       |o-ri-o{     order
order          ||-ri-|{     order_detail
order_detail    }-do-||      sku
sku             }-le-||     product
product        }o-le-||     vendor

note bottom of customer : 別プロジェクト\nDB-Linkで参照する

@enduml

```

## 結果

![newpumlTemplate.png](https://qiita-image-store.s3.amazonaws.com/0/37554/d6d2c34e-d36f-56e2-eaf9-f31b18c32b11.png)

[^1]: 初め、1.2017.08 が「2017年の08月にリリースが予定されているバージョン」と勘違いしてしまいました。「2017年の８回目のリリース」のようで、３月に出ています。 [こちら](https://github.com/plantuml/plantuml/pull/31) の冒頭のコードがエラーになったので未サポートだと思っていました。記事投稿現在のバージョンは 1.2017.15 です。

[^2]: その所為なのかリリースノートにも書かれていないなど、あまりおおっぴらに「ERD サポート！」と言っていませんね。ひょっとして ER 図の需要は少ないのでしょうか。

[^3]: デフォルトのスタイルを設定する `skinparam` 構文では `class` を指定するなど、名残が見られます。