1. データベースとは?
データベース(DB)とは、データを整理して保存・管理するシステム のこと。
SQLを使用してデータの追加・検索・更新・削除(CRUD)が可能。
- RDB(リレーショナルデータベース) → MySQL, PostgreSQL, Oracle など
- NoSQL → MongoDB, Redis など(テーブルを持たず柔軟なデータ構造)
2. 1対1(One-to-One)のテーブル例
1対1の関係は、1つのレコードが別のテーブルの1つのレコードにのみ対応する関係。
例:ユーザーとユーザーの詳細情報
📌 テーブル構造
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
CREATE TABLE user_profiles (
user_id INT PRIMARY KEY,
email VARCHAR(255) NOT NULL,
phone VARCHAR(20),
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
-
users
に1つのレコードがあると、user_profiles
にも 1つだけ 対応するデータがある。
📌 1対1の JOIN
SELECT users.id, users.name, user_profiles.email, user_profiles.phone
FROM users
INNER JOIN user_profiles ON users.id = user_profiles.user_id;
3. 1対多(One-to-Many)のテーブル例
1つのレコードが、別のテーブルの 複数のレコードに対応 する関係。
例:ユーザーと投稿(1人のユーザーが複数の投稿を持つ)
📌 テーブル構造
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
CREATE TABLE posts (
id INT PRIMARY KEY,
user_id INT NOT NULL,
content TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
-
users
のid
がposts.user_id
に 複数回登場可能 → 1対多の関係
📌 1対多の JOIN
SELECT users.name, posts.content, posts.created_at
FROM users
INNER JOIN posts ON users.id = posts.user_id
ORDER BY posts.created_at DESC;
→ ユーザーごとの投稿を取得し、新しい順に並べる
4. 多対多(Many-to-Many)のテーブル例
1つのレコードが、別のテーブルの 複数のレコードに対応 し、かつ その逆もある。
例:生徒と授業(1人の生徒が複数の授業を受け、1つの授業に複数の生徒がいる)
📌 テーブル構造
CREATE TABLE students (
id INT PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
CREATE TABLE classes (
id INT PRIMARY KEY,
title VARCHAR(100) NOT NULL
);
CREATE TABLE student_classes (
student_id INT NOT NULL,
class_id INT NOT NULL,
PRIMARY KEY (student_id, class_id),
FOREIGN KEY (student_id) REFERENCES students(id) ON DELETE CASCADE,
FOREIGN KEY (class_id) REFERENCES classes(id) ON DELETE CASCADE
);
- 中間テーブル
student_classes
を作ることで、多対多を表現 -
student_id
×class_id
の組み合わせがユニーク(PRIMARY KEY (student_id, class_id)
)
📌 多対多の JOIN
SELECT students.name, classes.title
FROM students
INNER JOIN student_classes ON students.id = student_classes.student_id
INNER JOIN classes ON student_classes.class_id = classes.id;
→ 生徒と受講している授業を取得
🔥 まとめ
関係 | 例 | テーブル設計 |
---|---|---|
1対1 |
users ↔ user_profiles
|
user_profiles.user_id を PRIMARY KEY にする |
1対多 |
users ↔ posts
|
posts.user_id に FOREIGN KEY を設定 |
多対多 |
students ↔ classes
|
中間テーブル student_classes を作成 |