ER図の書き方まとめ

# はじめに
いよいよポートフォリオ作成が始まりました！
チーム開発から2回目のER図作成ですが、
カーディナリティの使い方が曖昧だったため勉強し直しました！
今回はIE記法のER図について記載します

# 名称を覚えよう
#### エンティティ
エンティティとは、データのまとまりのこと
今回の例でみると、「ユーザー」というエンティティ（データのまとまり）となります

<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782860/3b64e73f-b1ce-eb05-4d14-77a1282aad6c.png">

#### アトリビュート（属性）
アトリビュートとは、エンティティの中の属性のこと
テーブルでいうカラムのところで、今回は、投稿id〜更新日時まで全てです
PKと書かれている投稿idが主キー、FKがタグidという外部キーを指します

<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782860/73c6484d-7972-c1f3-b49b-95350812dba6.png">

#### リレーションシップ
リレーションシップとは、エンティティ同士の関係を表現する線です
１対多や１対１、多対多などいろいろな組み合わせがあります
今回は一人のユーザーが複数の投稿を持つことができるため、１対多の関係になります
この組み合わせを表現するために、カーディナリティという記号を使います

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782860/fb51168b-8ec0-a1ff-6ab2-e33b18aa5970.png">

#### カーディナリティ
カーディナリティは３つの記号を組み合わせて表現されます

<table>
  <tr>
    <th>記号　</th>
    <th>意味　</th>
  </tr>
  <tr>
    <td>　⚪︎</td>
    <td>0</td>
  </tr>
  <tr>
    <td>　|</td>
    <td>1</td>
  </tr>
  <tr>
    <td>　<img width="20" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782860/242f63a0-53a2-e02f-ae62-6b7a098d3cfe.png"></td>
    <td>多</td>
  </tr>
</table>

以下で詳しく見ていきます

##### １対１の関係
原則として、１対１の関係は一つのエンティティにまとめることができるため非推奨です
しかし、エンティティの分割、条件付きデータの管理、セキュリティ強化などの理由で意図的に使用する場合があります

今回の場合は一人のユーザーに対して、ユーザープロフィールは必ず一つあるので、１対１が成立します
また、外部キーはどちらか片方につけるのが一般的です

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782860/cd7972d7-aebe-ad6d-1fdb-ed18e514ead9.png">

##### １対多(１対０以上）の関係
こちらは先ほど使用した例です
一人のユーザーが複数の投稿を持つことができるため、１対多が成立します
ここで注目したいのは、投稿側のカーディナリティに⚪︎がついていることです

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782860/abd8ab88-b4b2-c9ab-8c6d-b0dce5d2216e.png">

これは、先ほどの表を見ると⚪︎と<img width="16" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782860/242f63a0-53a2-e02f-ae62-6b7a098d3cfe.png">が組み合わさっている状態で、
このようなリレーションシップを１対０以上の関係といいます

<table>
  <tr>
    <th>記号　</th>
    <th>意味　</th>
  </tr>
  <tr>
    <td>　⚪︎</td>
    <td>0</td>
  </tr>
  <tr>
    <td>　|</td>
    <td>1</td>
  </tr>
  <tr>
    <td>　<img width="20" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782860/242f63a0-53a2-e02f-ae62-6b7a098d3cfe.png"></td>
    <td>多</td>
  </tr>
</table>

例えばユーザーが新規登録をしたときは、投稿は一つも無いはずです
投稿されればいくらでも増えていきます

ユーザー１に対して、投稿が０の状態が成り立つか成り立たないかで考えましょう！

##### １対多(１対１以上）の関係
今回の場合は一回の注文は複数の注文詳細（商品＊N個、税込価格etc…）を持つことができるため、１対多が成立します
ここでも、注文詳細のカーディナリティに注目すると | と <img width="16" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782860/242f63a0-53a2-e02f-ae62-6b7a098d3cfe.png"> が組み合わさっていることがわかります

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782860/a5f32aae-24e7-903f-cd68-d91cef97a43c.png">

１回の注文に対して、注文詳細は必ず１以上になる
すなわち１回の注文に対して０個の注文詳細は成り立たないです！

##### 多対多の関係
例えるなら、学生とサークル所属についてです
学生はサークルに入らなくてもいいし、複数所属してもいい状態だとします
この状態を表現すると以下になります

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782860/3c775140-c632-6c05-862d-bb7d7f11e51c.png">

しかし、原則こういった書き方はしません
どうするのかというと、中間テーブルを作成して表現します↓

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782860/6d3133f6-e5ea-8a7b-f216-e9386d6b76af.png">

中間テーブルについてはこちらの記事が大変わかりやすかったです
是非読んでみてください！

https://qiita.com/ramuneru/items/db43589551dd0c00fef9

# さいごに
今回はよく使用するものをまとめています
曖昧な記載方法や他の記述方法（IDEF１X）などもあります！
また機会があれば勉強したいなと思います💪