コンテンツへスキップ

エンティティリレーションシップ図

エンティティ・リレーションシップモデル(またはERモデル)は、特定の知識領域における関連する関心事(エンティティ)を記述します。基本的なERモデルは、エンティティタイプ(関心事の種類)と、エンティティ(エンティティタイプのインスタンス)間に存在する可能性のある関係を指定して構成されます。Wikipedia

ERモデリングの実務者は、ほとんどの場合、エンティティタイプを単にエンティティと呼びます。例えば、CUSTOMERエンティティタイプは、単にCUSTOMERエンティティと呼ばれます。これは非常に一般的なので、他の方法をとることは賢明ではありませんが、技術的にはエンティティとはエンティティタイプの抽象的なインスタンスであり、これがER図が示すものです。抽象的なインスタンスとその間の関係です。これが、エンティティが常に単数名詞を使用して命名される理由です。

MermaidはER図をレンダリングできます。

エンティティ名は、多くの場合大文字で始まりますが、これに関する標準はなく、Mermaidでは必須ではありません。

エンティティ間の関係は、カーディナリティを表すエンドマーカーを持つ線で表されます。Mermaidは最も一般的なクロウフット表記を使用します。クロウフットは、接続されているエンティティの多くのインスタンスの可能性を直感的に伝えます。

ER図は、実装の詳細のない抽象的な論理モデルから、リレーショナルデータベーステーブルの物理モデルまで、さまざまな目的に使用できます。エンティティの目的と意味の理解を助けるために、ER図に属性定義を含めることが役立つ場合があります。これらは必ずしも網羅的である必要はありません。多くの場合、少数の属性サブセットで十分です。Mermaidでは、それらをタイプ名前で定義できます。

ER図に属性を含める場合、外部キーを属性として含めるかどうかを決定する必要があります。これはおそらく、リレーショナルテーブル構造をどの程度正確に表現しようとしているかによって異なります。あなたの図がリレーショナル実装を意味しない論理モデルである場合、関連付けられた関係がすでにエンティティの関連付け方を伝えているため、これらを省略する方が良いでしょう。たとえば、JSONデータ構造は、配列を使用して、外部キープロパティを必要とせずに、1対多の関係を実装できます。同様に、オブジェクト指向プログラミング言語は、コレクションへのポインタまたは参照を使用する場合があります。リレーショナル実装を目的としたモデルであっても、外部キー属性を含めると、関係によってすでに描かれている情報が重複し、エンティティに意味を追加しない可能性があると判断する場合があります。最終的には、あなたの選択です。

構文

エンティティと関係

ER図のMermaid構文はPlantUMLと互換性があり、関係にラベルを付けるための拡張機能があります。各ステートメントは次の部分で構成されます。

    <first-entity> [<relationship> <second-entity> : <relationship-label>]

ここで

  • first-entityはエンティティの名前です。名前は英字またはアンダースコア(v10.5.0+から)で始まり、数字とハイフンを含めることもできます。
  • relationshipは、両方のエンティティがどのように相互に関連しているかを記述します。下記参照。
  • second-entityは他のエンティティの名前です。
  • relationship-labelは、最初のエンティティの視点からの関係を記述します。

例えば

    PROPERTY ||--|{ ROOM : contains

このステートメントは、「プロパティは1つ以上の部屋を含み、部屋は1つだけのプロパティの一部である」と解釈できます。ここでラベルは最初のエンティティの視点からのものであることがわかります。プロパティは部屋を含みますが、部屋はプロパティを含みません。2番目のエンティティの視点から考えると、同等のラベルは通常非常に簡単に推測できます。(一部のER図では、両方の視点から関係にラベルを付けますが、これはここではサポートされておらず、通常は冗長です)。

ステートメントのfirst-entity部分のみが必須です。これにより、関係のないエンティティを表示することが可能になり、図の反復的な構築中に役立ちます。ステートメントの他の部分が指定されている場合、すべての部分は必須です。

関係構文

各ステートメントのrelationship部分は、3つのサブコンポーネントに分解できます。

  • 2番目のエンティティに対する最初のエンティティのカーディナリティ
  • 関係が「子」エンティティにIDを付与するかどうか
  • 最初のエンティティに対する2番目のエンティティのカーディナリティ

カーディナリティとは、別のエンティティのいくつの要素が問題のエンティティに関連付けられるかを記述するプロパティです。上記の例では、PROPERTYには1つ以上のROOMインスタンスが関連付けられますが、ROOMは1つのPROPERTYのみに関連付けることができます。各カーディナリティマーカーには2つの文字があります。外側の文字は最大値を表し、内側の文字は最小値を表します。以下の表は、可能なカーディナリティをまとめたものです。

値(左)値(右)意味
|oo|ゼロまたは1
||||厳密に1
}oo{ゼロ以上(上限なし)
}||{1以上(上限なし)

エイリアス

値(左)値(右)エイリアス
1またはゼロ1またはゼロゼロまたは1
ゼロまたは1ゼロまたは1ゼロまたは1
1以上1以上1以上
1または複数1または複数1以上
many(1)many(1)1以上
1+1+1以上
ゼロ以上ゼロ以上ゼロ以上
ゼロまたは複数ゼロまたは複数ゼロ以上
many(0)many(0)ゼロ以上
0+0+ゼロ以上
1のみ1のみ厳密に1
11厳密に1

識別

関係は、識別または非識別のいずれかに分類でき、それぞれ実線または点線でレンダリングされます。これは、問題のエンティティの1つが、他方なしでは独立して存在できない場合に関連します。たとえば、車を運転する人を保険に加入させる会社は、NAMED-DRIVERに関するデータを保存する必要があるかもしれません。これをモデル化するために、まず、CARは多くのPERSONインスタンスによって運転でき、PERSONは多くのCARを運転できることを観察するかもしれません。両方のエンティティは、他方なしで存在できるため、これは非識別関係であり、Mermaidでは次のように指定できます。PERSON }|..|{ CAR : "driver"。2つのエンティティ間に点線が引かれる、関係の中央にある2つの点が注目されます。しかし、この多対多の関係が2つの1対多の関係に解決されると、NAMED-DRIVERPERSONCARの両方なしでは存在できないことがわかります。関係は識別関係になり、ハイフンを使用して指定されます。ハイフンは実線に変換されます。

エイリアス

エイリアス
識別
オプションで〜非識別

属性

エンティティ名に続いて、複数のtype nameペアを含むブロックを指定することで、エンティティの属性を定義できます。ここで、ブロックは開始{と終了}で区切られます。属性はエンティティボックス内にレンダリングされます。例えば

type値は英字で始まり、数字、ハイフン、アンダースコア、括弧、角括弧を含めることができます。name値はtypeと同様の形式に従いますが、属性が主キーであることを示す別のオプションとしてアスタリスクで始めることもできます。それ以外に制限はなく、有効なデータ型の暗黙的なセットもありません。

エンティティ名エイリアス(v10.5.0+)

エンティティには、角括弧を使ってエイリアスを追加できます。エイリアスを指定した場合、図にはエンティティ名ではなくエイリアスが表示されます。

属性キーとコメント

属性には、keyまたはコメントを定義することもできます。キーは、主キー、外部キー、またはユニークキーを表すPKFKUKを指定できます。単一属性に複数のキー制約を指定する場合は、コンマで区切ります(例:PK, FK)。commentは、属性の最後に二重引用符で定義します。コメント自体には、二重引用符を含めることはできません。

その他

  • リレーションシップラベルを複数の単語にする場合は、二重引用符で囲む必要があります。
  • リレーションシップにラベルを付けたくない場合は、空の二重引用符で囲まれた文字列を使用する必要があります。
  • (v11.1.0以降) リレーションシップに複数行のラベルを付けたい場合は、2行の間に<br />を使用します("first line<br />second line")。

スタイル設定

設定オプション

簡単な色のカスタマイズについて

名前用途
fillエンティティまたは属性の背景色
strokeエンティティまたは属性の枠線の色、リレーションシップの線の色

使用されるクラス

より高度なスタイル設定のために、以下のCSSクラスセレクタを使用できます。

セレクタ説明
.er.attributeBoxEven偶数行の属性を含むボックス
.er.attributeBoxOdd奇数行の属性を含むボックス
.er.entityBoxエンティティを表すボックス
.er.entityLabelエンティティのラベル
.er.relationshipLabelリレーションシップのラベル
.er.relationshipLabelBoxリレーションシップラベルを囲むボックス
.er.relationshipLineエンティティ間のリレーションシップを表す線