timtim.<tech/>

データベース触り始めるのでER図に入門

データベース触り始めるのでER図に入門

3/31/2024

## はじめに なぜER図を描こうと思ったかと言うと、インターンの選考テストでSQLについての知識が問われたことがきっかけである。 テスト受験直前まで知識ゼロだったのだが、試験中に勉強している間にSQLでデータベースを操作できることに何気ない感動を覚えたし、データベース設計に興味が湧いてきた(受験中にブラウザ等で調べものが出来るルールだった)。 データベース設計の基本と言えばER図だと思っているので入門してみたまでである。 ついでにずっと気になっていたMermaid記法もついでに習得してやろう、ということでMermaidでER図を作成できるまでをゴールとしたい。 ## そもそもデータベース知識 早速ER図の作り方を調べていたのだが、データベースに対してあまりにも無知だったので、気になったところのメモを残しておく。 ### レコードとは **データベースの1件当たりのデータ単位**のこと。行列で例える時、データベースのカラム(各プロパティ)が列なら、レコードは行。 ### PK, UKの違い それぞれ主キー制約(Primary Key), 一意キー制約(Unique Key)である。 主キー制約は**とにかくレコードを識別するため**に設ける。そのためNull値を許容しない、NOT NULL制約がかけられている。 また名前の通り、**一つのカラムに対してのみ設定できる**。 よくあるのが例えば、ユーザデータの内、ユーザIDは一意であるために主キー制約を設けることで、1人のユーザを特定できる。 対して一意キー制約では各カラムの組み合わせがユニークであれば良いという仕組み。 そのため、**PKはUKの中の親分**のようにとらえることも出来そうだが、**PKと違うところはNull値を許容する**こと。 そのため、複数のレコードで対象のカラムがNull値でも重複判定はされない。 以下のページが参考になった。 - [一意制約(ユニーク制約 / UNIQUE制約)とは - 意味をわかりやすく - IT用語辞典 e-Words](https://e-words.jp/w/%E4%B8%80%E6%84%8F%E5%88%B6%E7%B4%84.html) - [主キーとユニークキーの違いとは?分かりやすく解説! | トーマスイッチ (toumaswitch.com)](https://toumaswitch.com/lhyptrfz6o/) - [一意性制約(UNIQUE KEY)と主キー制約 (PRIMARY KEY)は違う #初心者 - Qiita](https://qiita.com/hyougo-suga/items/9ce65df7e2e602d4f24b) ## ER図入門 ではER図ってなんぞやを学んでいく! ER図は”Entity Relationship Diagram”と訳され、「エンティティ同士の関係図」ということになる。 エンティティとはデータベースのテーブルのことであり、各テーブルの連携をER図で表現できるみたい。 そもそもの目的としてはデータ構造をハッキリさせることで、設計をしやすくすること。 また、ER図にも種類があり、 - 概念ER図 - 論理ER図 - 物理ER図 がある。 今回主に扱うのは物理ER図である。 ER図にはそれぞれ以下の要素で構成されている。 - エンティティ - 直訳「モノ」。テーブルのこと - アトリビュート - エンティティの中のカラムのこと - リレーション - テーブルをつなぐ線 - カーディナリティ - 直訳「多重度」 - リレーションの始点・終点に付いており、エンティティ同士の要素数の比率などを表す - e.g. 1対1, 1対多数, 1対0か多数など ![20240331032021](//images.ctfassets.net/uv97b8agzmvd/1iG32j2CgKSJKHR2PGdMcP/8721f6ab94fb49b0bc9f6ebe51cfb269/20240331032021.png) [https://web-img.rensa.jp.net/rensa/images/techmania/thumbnail/images/er1.png](https://web-img.rensa.jp.net/rensa/images/techmania/thumbnail/images/er1.png) ### アトリビュートを構成する要素 アトリビュートは以下の内容から成り立っています。 - データ型 - e.g. INT, CHARなど - カラム名 - まんまカラムの名前 - e.g. id, name, ageなど - キー - 先ほど説明したPK, UKに加えて外部キー FK(Foreign Key)を指定する - 参考: [ER図を簡単に作成してみよう【DB設計】【Mermaid】 (zenn.dev)](https://zenn.dev/seiya0/articles/tech-mermaid-erd#er%E5%9B%B3%EF%BC%88entity-relationship-diagram%EF%BC%89%E3%81%A8%E3%81%AF)のMermaid記述法 → PK, FK, UKとは - 備考 - 補足コメントを入れられる - e.g. “`age`の上限は120”, “田中さんはブラックリストね”など おそらく順不同だが、私はこの順番に従うことにする。 ### 参考 以下のページを参考にしました。 - [ER図とは?書き方をサンプルコードでわかりやすく解説 │ TechMania](https://techmania.jp/blog/er-diagram/) - [ER図とは?基本ルールから書き方まで徹底解説! (data-viz-lab.com)](https://data-viz-lab.com/er-diagram) - [ER図を簡単に作成してみよう【DB設計】【Mermaid】 (zenn.dev)](https://zenn.dev/seiya0/articles/tech-mermaid-erd#er%E5%9B%B3%EF%BC%88entity-relationship-diagram%EF%BC%89%E3%81%A8%E3%81%AF) ## MermaidでER図 座学はここで終了。実際にER図を作成してみる。 まず言葉でデータベースの設計を行ってみる。 ### 文章でデータベース構造定義 以下2つのエンティティを定義した。 - エンティティ名: users - 各カラム - int id PK “固有のユーザID” - varchar name “ユーザ名” - text profile “ユーザの紹介文” - エンティティ名: articles - usersエンティティと連携 - 1ユーザ当たり投稿数は0でもいいし、複数あっても良い - 各カラム - int id PK “ブログ投稿を識別するためのID。slugとしても使う” - int author_id FK “著者のID。usersエンティティと連携” - varchar title “ブログのタイトル” - varchar description “ブログの説明” - text contents “ブログ本文” - bit is_public “公開するか否か” ここで使えるデータ型が何なのか詰まったので[SQLのデータ型まとめ #SQL - Qiita](https://qiita.com/shuhoyo/items/07d28cec6babe788051d)を参考とした。 ### Mermaidで書いてみる それではこれをER図に起こしてみる。 ```mermaid --- Title: "ブログのデータベース設計" --- erDiagram users ||--o{ articles : "" users { int id PK "固有のユーザID" varchar name "ユーザ名" text profile "ユーザの紹介文" } articles { int id PK "ブログ投稿を識別するためのID。slugとしても使う" int author_id FK "著者のID。usersエンティティと連携" varchar title "ブログのタイトル" varchar description "ブログの説明" text contents "ブログ本文" bit is_public "公開するか否か" } ``` わーおい!ER図ええなあーーー⁉ 箇条書きでも十分見やすかったけど、ER図のほうが見やすいでんな(もちろん慣れは必要やけど基本データベース設計している人は知ってる人たちやから関係ない気がする)。 感動ポイントを1つ挙げると、カーディナリティの記法が表現そっくりなこと。 これやったらいちいちカーディナリティを覚えなくても直感的に書けるから素敵やな。 ### 参考 - [SQLのデータ型まとめ #SQL - Qiita](https://qiita.com/shuhoyo/items/07d28cec6babe788051d) ## まとめ 最初はカーディナリティが面倒くさそうに見えたけど、実際に触ってみたらそこまで難しくなかったし、もうちょっと早くMermaid記法に触れておけばよかった。。 ぶっちゃけデータベースを触らない人だったから勉強する意味が無かったんやけど、近頃の開発でデータベースを使うのでいい勉強になった。 素人でもちょっとの説明でデータベース構造が手に取れるのが良いところだと思った。 Mermaidが一番アツかった時期(たしかリリースされた2022年ごろ)から少し経っているおかげで主要ドキュメントツールはほとんどMermaid対応しているところもいいね。 個人的に使いたいMermaid記法についてもまとめたいけど、趣旨が変わるのでまた別記事で。 それでは👋