ちょっと時間をとって、今までやった内容をおさらいしよう。ステップごとに何が起きてるか、しっかり確認していくよ。この先、今まで学んだことがベースになることがたくさん出てくるから、各コマンドが何をしてるのかバッチリ理解しておこう!
もう一度、学生とコースの例を最初からやってみよう。テーブル作成から、各ステップで何が起きてるかまで。準備はいい?
これからstudentsテーブルを作って、学生の情報を保存するよ。そして外部キーを使ってcoursesテーブルとつなげる。こうやってエンティティ同士の関係をモデリングする時に外部キーがどう使われるか見ていこう!
studentsテーブルの作成
studentsテーブルには、学生のユニークID、名前、生年月日を保存するよ。CREATE TABLEコマンドを使って作成しよう。
CREATE TABLE students (
student_id SERIAL PRIMARY KEY, -- 各レコードのユニークキー
name TEXT NOT NULL, -- 学生の名前(必須)
birth_date DATE -- 学生の誕生日
);
ここで何が起きてる?
student_id SERIAL PRIMARY KEY: これは各学生のユニークIDだよ。SERIAL型で自動的に増えるフィールドを作って、PRIMARY KEYで各行のIDがユニークになるようにしてる。name TEXT NOT NULL: 学生の名前用のフィールド。NOT NULLを指定してるから、名前なしでレコードを追加できないようになってる。birth_date DATE: 誕生日を保存するフィールド。DATE型で日付を扱えるよ。
もしテーブルが人間だったら、student_idはパスポート、nameはそのまま名前、birth_dateは…まあ普段は隠したいけど、DB的には大事な情報だね。
coursesテーブルの作成
次はコース情報を保存するテーブルを作るよ。コースID、タイトル、説明を含める。
CREATE TABLE courses (
course_id SERIAL PRIMARY KEY, -- コースのユニークID
title TEXT NOT NULL, -- コース名(必須)
description TEXT -- コースの説明
);
ここで何が起きてる?
course_id SERIAL PRIMARY KEY: これも自動で増えるフィールドで、各コースのユニークIDになる。title TEXT NOT NULL: コース名用のフィールド。NOT NULLで、どんなコースにも名前が必要ってことだね。description TEXT: コースの説明用。これはオプションで、空でもOK(NOT NULLなし)。
タイトルのないコースは、表紙のない本みたいなもん。DBはそれを許してくれないよ!
studentsテーブルとcoursesテーブルの関連付け
今度は、各学生が一つのコースだけに登録できると仮定しよう。そのためにcoursesテーブルに外部キーを追加して、studentsテーブルのIDを参照するようにするよ。
CREATE TABLE courses (
course_id SERIAL PRIMARY KEY, -- コースのユニークID
title TEXT NOT NULL, -- コース名(必須)
description TEXT, -- コースの説明
student_id INT REFERENCES students(student_id) -- studentsテーブルへの外部キー
);
student_id INT REFERENCES students(student_id)は何してる?
student_idフィールドを作って、studentsテーブルのユニークID(student_id)を参照するようにしてる。- テーブル同士の関連は
REFERENCESキーワードで作る。 - つまり、
coursesにデータを追加する時、student_idの値はstudentsテーブルに存在してないとダメ。例えば、存在しないstudent_idでコースに登録しようとするとエラーになるよ。
テーブルへのデータ挿入
テーブルができたら、学生とコースをちょっと追加してみよう。空っぽの教室じゃつまらないもんね!
学生を追加する
INSERT INTO students (name, birth_date) VALUES
('Alex Lin', '2000-05-10'),
('Maria Chi', '1998-02-15'),
('Otto Song', '2001-09-25');
コースを追加する
INSERT INTO courses (title, description, student_id) VALUES
('SQLの基礎', 'SQLの基本構文を学ぶ', 1),
('リレーショナルデータベース', 'リレーショナルモデルの理解', 2),
('初心者向けPostgreSQL', 'PostgreSQLのインストールと設定', 3);
各コースにstudent_idを指定して、studentsテーブルのIDとつなげてるよ。
テーブル間の関連を確認する
じゃあ、本当にテーブルがつながってるか確認しよう。コース情報と学生名を一緒に表示するクエリを作るよ。
SELECT
courses.title AS course_title,
courses.description AS course_description,
students.name AS student_name
FROM
courses
JOIN
students ON courses.student_id = students.student_id;
例:クエリの結果:
| course_title | course_description | student_name |
|---|---|---|
| SQLの基礎 | SQLの基本構文を学ぶ | Alex Lin |
| リレーショナルデータベース | リレーショナルモデルの理解 | Maria Chi |
| 初心者向けPostgreSQL | PostgreSQLのインストールと設定 | Otto Song |
外部キーでコースと学生をつなげて、1つのクエリで関連データを取得できるようになった!これがリレーショナルモデルの力だね!
まとめ
今やったことがちゃんと理解できてたら嬉しいな。これからもっと進んでいくから、自信を持ってついてきてね!
GO TO FULL VERSION