PlantUMLのクラス図を使って 無理矢理 ER図を作ります。オススメはしません。自分の備忘録・チートシートです。タイトルを「PlantUML で ER 図を描く」にしてしまうと怒られそうなので「似非」を入れました。
追記:2017/07/27
バージョン 1.2017.08 が「2017年の08月にリリースが予定されているバージョン」と勘違いしてしまいました↓。「2017年の8回目のリリース」のようで、既に3月に出ています。
こちら の冒頭のコードがエラーになったので未サポートだと思っていました。投稿の流れを全部読んだら「カーディナリティは最終的に『>o--o<』じゃなくて『}o--o{』で書けるようにします」との記述がありました。サンプルのコードを、そのように直すと、ちゃんと鳥足が描画されました。
現在のバージョンは 1.2017.15 です。
新しい記事に書き直しましたので、そちらをご覧ください。
追記
2017年 8月リリース予定の新しいバージョンで ER 図に対応するようです。
@shida さんコメントありがとうございます。
以下、2017年 2月の投稿です。
はじめに
かつてはA5:SQL Mk-2のER図機能を使っていて、その出力ファイルはテキストだったので、同じく Git などでバージョン管理出来るメリットがあったのですが、Mac 版がないのは厳しく...。
テキストベースでER図を描けるメリットは...
- ファイルが軽い。
- Git などでバージョン管理しやすい。
- (プログラマは往々にしてドキュメントを作るのが嫌いだが)プログラム組んでいるようで楽しく作れる(モチベーションは大事だよね)。
...などがあります。
PlantUMLではER図を(まだ)サポートしていません。テキストベースでは他にもGraphviz(Dot言語)や、そのままズバリERD(BurntSushi/erd)という選択肢があるのですが以下の理由でPlantUMLのクラス図を使っています。
- メインドライブの容量が枯渇し、あまり多くのツールを入れたくない。
- セットアップが多いと 布教する時につらい 。
- 思ったより良かった。
参考
ER図そのものについては下記のサイトが詳しいです。
ER図 (Entity Relationship Diagram)
また、書き方については下記の書籍が詳しいです。オススメです。
楽々ERDレッスン
サンプル
下記のページからテーブル構成を参考にしました。
若手プログラマー必読!5分で理解できるER図の書き方5ステップ
@startuml
package "外部データベース" as ext <<Database>> {
Class "顧客マスタ" as customer <<M,AAFFAA)>> {
+顧客ID [PK]
---
顧客名
郵便番号
住所
電話番号
FAX
}
}
package "開発対象システム" as target_system {
/'
マスターテーブルを M、トランザクションを T などと安直にしていますが、
チーム内でルールを決めればなんでも良いと思います。交差テーブルは "I" とか。
角丸四角形が描けない代替です。
1文字なら "主" とか "従" とか日本語でも 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
結果
その他
本当はカーディナリティはこんな風に書きたい。
------ :1
-----+ :1
----++ :1 and only 1
----+0 :0 or 1
-----{ :many
----+{ :1 or more
----0{ :0 or many