※学習中のため誤っている箇所があるかもしれません。
ER図とは?
ER図(Entity Relationship Diagram)とはデータベースの設計図です。
データの構造を視覚的に表現することで、効率的なデータベース設計を行うことができます。
ER図はツールやウェブサービスを利用することで簡単に作成できます。
今回は以下のサービスを利用しました。
https://dbdiagram.io/:ブラウザ上でER図を簡単に作成できる無料ツール
ER図の種類
概念ER図:抽象的で主にテーブル名称とその関係性を記載
論理ER図:概念ER図に中身を追加し、詳細化したもの
物理ER図:実際のデータベース構造に合わせて作成したもの
論理ER図、概念ER図に関しては今回作成は省略します。
チーム開発であれば情報整理のため作成したほうがいいかもしれません。
しかし、小規模開発だとあまり論理ER図とその他ER図の違いがなく、複数作成する意味があまりないため
以下の物理ER図のみ作成しました
説明
今回の記事投稿サイトで
それぞれの情報を保持するため
以下のようなテーブルを設計しています
ユーザーテーブル
登録したユーザー情報
記事テーブル
ユーザーが投稿した記事情報
タグテーブル
記事に設定されたタグ情報
article_tagsは
タグテーブルと記事テーブルの「多対多」を管理するための中間テーブルです。
リレーションシップ
ER図に記載されている記号について説明します。
0...1
これは「0件または1件までの関連」があることを表します
*
この記号は接続元に対し、多数であることを表します。
三又になっている場所で、
userテーブルのidに対して
articleに登録されいているuser_idが複数存在していることを意味します。
userテーブルとarticleテーブル
0または1件のusers.idに対し、複数のarticle.user_id情報が存在します。
そのため「users.id : article.user_id」は1対多(1:N)の関係です。
※0件の可能性があるのは、ユーザーが削除された場合でも記事情報は残るためです
tagsテーブルとarticleテーブル
1件のtags.tag_idに対し、複数のarticle_tags.tag_idが存在します。
こちらも上記同様「tags.tag_id : article_tags.tag_id」が1対多(1:N)の関係です。
article_tagsテーブルに関して
このテーブルを作成したのは
タグテーブルと記事テーブルの多対多を整理して登録することができます。
記事テーブルにタグ情報を保存しようとすると
id | user_id | title | content | tag1 | tag2 | tag... |
---|---|---|---|---|---|---|
このように記事テーブルにタグ情報を持たせると
tag1,tag2,tag3...カラムを増やす必要が出てきます。
このような構造は柔軟性に欠け、運用や検索が困難になります。
しかしarticle_tagsを作成し、中間テーブルを作成することで
動的に管理することができます。
tag_id | article_id | created_at |
---|---|---|
タグテーブルのid | 記事テーブルのid | 作成日 |
以下は例として記載した簡易なテーブルデータです。
タグテーブル
tag_id | tag_name | status |
---|---|---|
001 | JAVA | 2025/01/01 |
002 | PYTHON | 2025/01/01 |
003 | PHP | 2025/01/01 |
article_tags
tag_id | article_id | created_at |
---|---|---|
001 | 0001 | 作成日 |
002 | 0001 | 作成日 |
003 | 0002 | 作成日 |
記事テーブル
id | user_id | title | content |
---|---|---|---|
0001 | example@example.com | JAVAとPYTHON | ~ |
0002 | example@example.com | PHP | ~ |
こうすることでタグ情報が増えても、テーブルに新たに登録するだけで
情報を増やしていくことができます
複合主キー
今回article_tagsでは複合主キーを採用しています。
複合主キーとは、tag_id + article_idを結合し、主キーとして扱います。
サロゲートキーではなく、複合主キーを採用した理由として、
同一記事に同じタグが複数紐づけされることを防ぐといった理由があります。
(※サロゲートキーとは、意味を持たない自動連番のIDのことです)
まとめ
この記事では、ER図の概要から、記事投稿システムのテーブル構造、リレーションの考え方までを紹介しました。
ポートフォリオ作成やチーム開発の土台づくりに、少しでも役立てば嬉しいです。
次回は、このER図をもとにSpring Boot側のEntity定義とAPI設計を進めていく予定です。
参考
前:Spring Boot + Reactで記事投稿アプリを作成予定|機能整理と設計メモ
次:Spring Boot + Reactで記事投稿アプリを作成予定|Entity・三層アーキテクチャ学習ログ