エンティティリレーションシップ図
エンティティ・リレーションシップモデル(または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つの文字があります。外側の文字は最大値を表し、内側の文字は最小値を表します。以下の表は、可能なカーディナリティをまとめたものです。
値(左) | 値(右) | 意味 |
---|---|---|
|o | o| | ゼロまたは1 |
|| | || | 厳密に1 |
}o | o{ | ゼロ以上(上限なし) |
}| | |{ | 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 |
1 | 1 | 厳密に1 |
識別
関係は、識別または非識別のいずれかに分類でき、それぞれ実線または点線でレンダリングされます。これは、問題のエンティティの1つが、他方なしでは独立して存在できない場合に関連します。たとえば、車を運転する人を保険に加入させる会社は、NAMED-DRIVER
に関するデータを保存する必要があるかもしれません。これをモデル化するために、まず、CAR
は多くのPERSON
インスタンスによって運転でき、PERSON
は多くのCAR
を運転できることを観察するかもしれません。両方のエンティティは、他方なしで存在できるため、これは非識別関係であり、Mermaidでは次のように指定できます。PERSON }|..|{ CAR : "driver"
。2つのエンティティ間に点線が引かれる、関係の中央にある2つの点が注目されます。しかし、この多対多の関係が2つの1対多の関係に解決されると、NAMED-DRIVER
はPERSON
とCAR
の両方なしでは存在できないことがわかります。関係は識別関係になり、ハイフンを使用して指定されます。ハイフンは実線に変換されます。
エイリアス
値 | エイリアス |
---|---|
〜 | 識別 |
オプションで〜 | 非識別 |
属性
エンティティ名に続いて、複数のtype name
ペアを含むブロックを指定することで、エンティティの属性を定義できます。ここで、ブロックは開始{
と終了}
で区切られます。属性はエンティティボックス内にレンダリングされます。例えば
type
値は英字で始まり、数字、ハイフン、アンダースコア、括弧、角括弧を含めることができます。name
値はtype
と同様の形式に従いますが、属性が主キーであることを示す別のオプションとしてアスタリスクで始めることもできます。それ以外に制限はなく、有効なデータ型の暗黙的なセットもありません。
エンティティ名エイリアス(v10.5.0+)
エンティティには、角括弧を使ってエイリアスを追加できます。エイリアスを指定した場合、図にはエンティティ名ではなくエイリアスが表示されます。
属性キーとコメント
属性には、key
またはコメントを定義することもできます。キーは、主キー、外部キー、またはユニークキーを表すPK
、FK
、UK
を指定できます。単一属性に複数のキー制約を指定する場合は、コンマで区切ります(例: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 | エンティティ間のリレーションシップを表す線 |