マーメード#13 ER図

**ひとりマーメイド13日目**
**ER図**

## 概要
マーメイドエンジニアのひろきです。こんにちは。
最近流行り（流行らせたい）のマーメイドについて理解を深めていこうと思います。

この記事ではER図の記述について紹介します！

↓↓前回の記事はこちら

https://qiita.com/hirokiwa/items/b7739d54551ce1656dd1

## マーメイドで記述するER図
前回の記事では状態遷移図の記法を紹介しました。
今日はER図を見ていきます。ER図はデータ構造やその関係性を可視化するための図であり、主にデータベース設計で用いられます。

```:mermaid
erDiagram
    USER{
        number user_id
        string user_name
    }

    FOLLOW{
        number follow_id
        number user_id
    }

    FOLLOWER{
        number follower_id
        number user_id
    } 

    POST{
        number post_id
        number user_id
        string title
        string text
        datetime posted_at
    }

    REPLY{
        number reply_id
        number reply_to
        number user_id
        string text
        datetime posted_at
    }

    USER ||--o{ FOLLOW: ""
    USER ||--o{ FOLLOWER: ""
    USER ||--o{ POST: ""
    POST ||--o{ REPLY: ""
```
```mermaid
erDiagram

    USER{
        number user_id
        string user_name
    }

    FOLLOW{
        number follow_id
        number user_id
    }

    FOLLOWER{
        number follower_id
        number user_id
    } 

    POST{
        number post_id
        number user_id
        string title
        string text
        datetime posted_at
    }

    REPLY{
        number reply_id
        number reply_to
        number user_id
        string text
        datetime posted_at
    }

    USER ||--o{ FOLLOW: ""
    USER ||--o{ FOLLOWER: ""
    USER ||--o{ POST: ""
    POST ||--o{ REPLY: ""
```

## エンティティの宣言
エンティティを宣言します。エンティティ名を記述するとノードが生成されます。
`ENTITY_NAME`

```:mermaid
erDiagram
    USER
```
```mermaid
erDiagram
    USER
```

**アトリビュート**
エンティティに含める属性をアトリビュートといいます。
アトリビュートは以下のように定義されます。
```
ENTITY_NAME{
    TYPE ATTRIBUTE
    .
    .
    .
}
```
ER図では左に型、右にkeyを記述するのが一般的です。
```:mermaid
erDiagram
    USER{
            number user_id
            string user_name
    }
```
```mermaid
erDiagram
    USER{
            number user_id
            string user_name
        }
```
## リレーション
エンティティ同士の接続をリレーションとよびます。

以下のような記述でエンティティ同士を結ぶことができます。
`ENTITY_1 ||--o{ ENTITY_2: "COMMENT"`

`:`以降にテキストを記述します。レンダリングの都合上これは必須なので、特に書くことがない場合は`""`と記述してください。
```:mermaid
erDiagram
    USER ||--o{ FOLLOW: ""
    USER ||--o{ POST: "posted"
```
```mermaid
erDiagram
    USER ||--o{ FOLLOW:""
    USER ||--o{ POST: "posted"
```

## 直線と破線
リレーションの線の種類を指定することができます。
|||
|---|---|
|--|直線|
|..|破線|
```:mermaid
erDiagram
    USER ||--o{ FOLLOW: ""
    USER ||..o{ POST: ""
```
```mermaid
erDiagram
    USER ||--o{ FOLLOW:""
    USER ||..o{ POST: ""
```


## カーディナリティ
カーディナリティを用いてエンティティの多重度を表現します。`1対1`や`1対多`みたいなやつです。
||||
|---|---|---|
|\|o|o\||0 or 1|
|\|\||\|\||1|
|}o|o{|0以上|
|}\||\|{|1以上|

```:mermaid
erDiagram
    ER1 |o--o| ER2: "0 or 1"
    ER3 ||--|| ER4: "1"
    ER5 }o--o{ ER6: "0以上"
    ER7 }|--|{ ER8: "1以上"
```
```mermaid
erDiagram
    ER1 |o--o| ER2: "0 or 1"
    ER3 ||--|| ER4: "1"
    ER5 }o--o{ ER6: "0以上"
    ER7 }|--|{ ER8: "1以上"
```
## 主キーと外部キー
属性に主キー/外部キーを定義することができます。
|||
|---|---|
|FK|外部キー|
|PK|主キー|

`TYPE ATTRIBUTE KEY`

```:mermaid
erDiagram
    USER{
        number user_id PK
        string user_name
    }

    POST{
        number user_id FK
        number post_id
        string title
        string text
        datetime posted_at
    }

    USER ||--o{ POST: ""
```


```mermaid
erDiagram
    USER{
        number user_id PK
        string user_name
    }

    POST{
        number user_id FK
        number post_id
        string title
        string text
        datetime posted_at
    }

    USER ||--o{ POST: ""
```
## アトリビュートコメント
属性にコメントを付与することができます。
`TYPE ATTRIBUTE "COMMENT"`
```:mermaid
erDiagram
    USER{
        number user_id   "This is the comment"
        string user_name "Hello comment"
    }
```
```mermaid
erDiagram
    USER{
        number user_id   "This is the comment"
        string user_name "Hello comment"
    }
```

keyとコメントの両方を付与することも可能です。この場合必ずkeyが左になります。
`TYPE ATTRIBUTE KEY "COMMENT"`
```:mermaid
erDiagram
    USER{
        number user_id   FK "This is the comment"
        string user_name "Hello comment"
    }
```
```mermaid
erDiagram
    USER{
        number user_id   FK "This is the comment"
        string user_name "Hello comment"
    }
```

## まとめ
ER図の基本的な記法について紹介しました！

↓↓次回の記事はこちら！！

https://qiita.com/hirokiwa/items/144283422fe8a659b80c

## 参考

https://mermaid.js.org/