Skip to content

エンティティ関係図

エンティティ–リレーションシップモデル(またはERモデル)は、特定の知識の領域における相互に関連する興味のある事柄を説明します。基本的なERモデルはエンティティタイプ(興味のある事柄を分類する)で構成され、エンティティ間に存在する可能性のある関係を指定します(これらのエンティティタイプのインスタンス)Wikipedia

ERモデリングの実務者は、ほぼ常に エンティティタイプ を単に エンティティ として参照します。たとえば、CUSTOMERエンティティ タイプ は単に CUSTOMERエンティティとして言及されます。これは非常に一般的で、他のことをするのは不適切ですが、技術的にはエンティティはエンティティタイプの抽象的な インスタンス であり、これがERダイアグラムで示されるものです - 抽象的なインスタンスとそれらの間の関係です。これが、エンティティが常に単数名詞を使用して命名される理由です。

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

Code:
mermaid

エンティティ名はしばしば大文字で表記されますが、これに関する受け入れられた標準はなく、Mermaidでは必須ではありません。

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

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

Code:
mermaid

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

構文

エンティティと関係

MermaidのER図の構文は、PlantUMLと互換性があり、関係をラベル付けするための拡張機能を持っています。各文は以下の部分で構成されています。

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

ここで:

  • first-entity はエンティティの名前です。名前はアルファベット文字またはアンダースコアで始まる必要があり(v10.5.0以降)、数字やハイフンを含むこともできます。
  • relationship は両方のエンティティがどのように相互に関連しているかを説明します。以下を参照してください。
  • second-entity は他のエンティティの名前です。
  • relationship-label は最初のエンティティの視点から関係を説明します。

たとえば:

    PROPERTY ||--|{ ROOM : contains

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

文の first-entity 部分のみが必須です。これにより、関係なしにエンティティを示すことが可能となり、ダイアグラムの反復的な構築中に有用です。文の他の部分が指定された場合、すべての部分が必須になります。

関係の構文

各文の relationship 部分は、3つのサブコンポーネントに分けることができます。

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

カーディナリティは、あるエンティティがどのくらいの数の別のエンティティの要素に関連できるかを説明するプロパティです。上記の例では、PROPERTY は一つ以上の ROOM インスタンスを関連付けられるのに対し、ROOM は一つの PROPERTY のみにしか関連付けられません。各カーディナリティマーカーには2文字があります。最外側の文字は最大値を示し、最内側の文字は最小値を示します。以下の表は可能なカーディナリティを要約しています。

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

エイリアス

値(左)値(右)エイリアス
ゼロまたは1ゼロまたは1ゼロまたは1
一つ以上一つ以上一つ以上
多数(1)多数(1)一つ以上
1+1+一つ以上
ゼロ以上ゼロ以上ゼロ以上
ゼロか多数ゼロか多数ゼロ以上
だけ一つだけ一つ正確に1
11正確に1

識別

関係は 識別的 または 非識別的 に分類でき、それぞれ固体線または点線で表示されます。これは、問題のうちの1つのエンティティが他のエンティティなしでは独立した存在ができない場合に関連しています。たとえば、車を運転する人々を保険する会社は、NAMED-DRIVER のデータを保存する必要があるかもしれません。これをモデル化すると、CAR は多くの PERSON インスタンスによって運転される可能性があり、PERSON は多くの CAR を運転できます - 両方のエンティティは他のエンティティなしで存在できますので、これは非識別的関係で、Mermaidで PERSON }|..|{ CAR : "driver" と指定することがあります。ここでの関係の中の2つの点は、2つのエンティティ間に点線が描かれる結果になります。しかし、この多対多の関係を2つの一対多の関係に解消すると、NAMED-DRIVERPERSONCAR の両方がなければ存在できないことがわかります - したがって、関係は識別的になり、ハイフンを使用して指定され、固体線に変換されます。

エイリアス

エイリアス
to識別的
optionally to非識別的

属性

属性は、エンティティ名の後に複数の type name ペアを含むブロックを指定することによってエンティティのために定義できます。ブロックは開括弧 { と閉括弧 } で区切られます。属性は、エンティティボックス内に描画されます。例えば:

Code:
mermaid

type の値はアルファベット文字で始まる必要があり、数字、ハイフン、アンダースコア、丸括弧、角括弧を含むことができます。name の値は type と似た形式に従いますが、主キーを示すために別のオプションとしてアスタリスクで始まることができます。それ以外には制限はなく、有効なデータタイプの暗黙のセットはありません。

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

エンティティにエイリアスを追加するには、角括弧を使用します。提供される場合、エイリアスはエンティティ名の代わりに図に表示されます。

Code:
mermaid

属性キーとコメント

属性には key またはコメントを定義することもできます。キーは、主キー、外部キー、またはユニークキー用に PKFK、または UK です。単一の属性に複数のキー制約を指定するには、カンマで区切ります(例:PK, FK)。コメントは、属性の末尾にダブルクォーテーションを付けることによって定義されます。コメント自体にはダブルクォーテーション文字を含むことはできません。

Code:
mermaid

その他の事項

  • 関係のラベルが複数の単語である場合、フレーズ全体をダブルクォーテーションで囲む必要があります
  • 関係にラベルを全く付けたくない場合、空のダブルクォーテーション文字列を使用する必要があります
  • (v11.1.0+) 関係に複数行のラベルを付けたい場合は、2行の間に <br /> を使用します(例:"first line
    second line")。

スタイリング

設定オプション

簡単な色のカスタマイズのために:

名称使用目的
fillエンティティまたは属性の背景色
strokeエンティティまたは属性の境界色、関係の線の色

使用されるクラス

以下のCSSクラスセレクタは、リッチなスタイリング用に利用可能です:

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