真面目に PlantUML (4) : 実体関連図

no extension

今回は実体関連図(entity-relationship diagram)について。

実体関連モデル(entity-relationship model)は関係データベース(relational database)を抽象的に表現する手法のひとつで,実体関連モデルを図で表したものが実体関連図である。

実体関連モデルのうち特に物理データモデルを表した実体関連図は関係データベースの実装とよくマッチしているため,関係データベースのスキーマ設計でよく使われ,逆に関係データベースのスキーマを実体関連図に逆コンパイルするリバースエンジニアリング・ツールもある。

では実体関連図の記法について紹介してみよう。

目次

  1. PlantUML のインストール
  2. シーケンス図
  3. クラス図
  4. 実体関連図 ← イマココ

UML のクラス図を使った記法

実体関連モデルは以下の3つの要素で表すことができる。

  • 実体(entity)
  • 関連(relationship)
  • 属性(attribute)

「実体」同士の関係は「関連」で表すことができる。 また「実体」および「関連」はそれぞれ「属性」を持つことができる。

これを見てピンとくる方もいるだろうが,実は実体関連図は UML のクラス図を使って表すことができる。 「実体」を表すのがクラスであり,クラス同士を繋いだ関係線が「関連」に相当する。 たとえばこんな感じ。

@startuml

class "Entity A" as A {
  {field} id : int <<PK>>
  {field} name : string
  {field} location : string
}
class "Entity B" as B {
  {field} subid : int <<PK>>
  {field} id : int <<PK,FK>>
  {field} subname : string
}

A "1" <.left. "0..n" B : more info >

@enduml

これで Entity BEntity A の依存エンティティであることが分かる(これに対して外部キーを含まない Entity A を独立エンティティと呼ぶ)。 またステレオタイプを使って PKFK を表現している。 更に多重度をつかって関連の「濃度(cardinality)」も表現できる。 更に更に PlantUML におけるクラスの属性はかなりアドホックな記述ができるため初期値や NOT NULL 制約のような付属情報も追記できるだろう。

IE (Information Engineering) 記法

PlantUML は IE 記法にも一部対応している。 たとえばこんな感じ。

@startuml

entity "Entity A" as A {
  id : int
  --
  name : string
  location : string
}
entity "Entity B" as B {
  subid : int
  id : int <<FK>>
  --
  subname : string
}

A ||.right.o{ B : more info >

@enduml

実体の属性は --==.. を使って任意に仕切ることができるが,通常は2つに分けて上半分を主キー属性,下半分を非キー属性とする。

関連を示す線は “Crow’s Foot” と呼ばれる記法で PlantUML では

Entity01 }|..|| Entity02
Entity03 }o..o| Entity04
Entity05 ||--o{ Entity06
Entity07 |o--|| Entity08

という感じに記述して濃度を表現する。 これは多重度表現の

Entity01 "1..n" .. "1" Entity02
Entity03 "0..n" .. "0,1" Entity04
Entity05 "1" -- "0..n" Entity06
Entity07 "0,1" -- "1" Entity08

と同等である。

なお PlantUML では IE 記法の依存エンティティを表現できない。 したがって先ほどの

において Entity AEntity B のどちらが依存エンティティなのか分かりにくい(まぁ属性を見れば分かるけど)。 独立エンティティと依存エンティティを明示的に区別したいのであれば,苦肉の策ではあるが UML のクラス図と IE 記法を混ぜて

@startuml

entity "Entity A" as A {
  id : int
  --
  name : string
  location : string
}
entity "Entity B" as B {
  subid : int
  id : int <<FK>>
  --
  subname : string
}

A "1" <.left. "0..n" B : more info >

@enduml

などとするのがいいかもしれない。 その辺はお好みで。

ブックマーク