なぜJOINが必要か(リレーショナルモデルの復習)
リレーショナルモデル、正規化されたテーブル、外部キーを復習し、テーブル間のデータを再結合する橋渡し役がJOINである理由を学びます。
「なぜJOINが必要か(リレーショナルモデルの復習)」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。
正規化を図で理解する
データを重複させる代わりに、複数のテーブルに分割します:
users— id、name、emailorders— id、user_id、total
各注文は、ユーザーの名前やメールアドレスを再度保存するのではなく、idでユーザーを参照します。
なぜ正規化するのか
メリット:
- 重複がない — ユーザーのメールアドレスを1か所で変更できます
- テーブルが小さい — キャッシュヒット率が向上します
- 制約によってリレーションシップを適用できます
外部キーでリンクを定義する
リンクはFOREIGN KEYで宣言します:
CREATE TABLE orders (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT NOT NULL REFERENCES users(id),
total NUMERIC(10,2) NOT NULL
);JOINによるデータの再構成
「各注文にユーザーの名前を表示する」には、テーブルを再びJOINして結合します:
SELECT o.id, o.total, u.full_name, u.email
FROM orders o
JOIN users u ON u.id = o.user_id
ORDER BY o.id;メンタルモデル:絞り込まれた直積
JOINの概念上の動作:
- 2つのテーブルの直積を作ります(Aのすべての行とBのすべての行を組み合わせます)
- ON条件がTRUEになる組み合わせだけを残します
実際には、データベースはハッシュ結合、マージ結合、またはネステッドループ結合を使用しますが、結果は同じです。
1対多
1人のユーザーは複数の注文を持てます。「多」の側が外部キーを持ちます。
-- Each order row points back to its user:
SELECT u.email, COUNT(o.id) AS order_count
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
GROUP BY u.id, u.email;結合テーブルによる多対多
タグ ↔ 投稿:3つ目のテーブルを追加します:
CREATE TABLE posts (id BIGSERIAL PRIMARY KEY, title TEXT);
CREATE TABLE tags (id BIGSERIAL PRIMARY KEY, name TEXT);
CREATE TABLE post_tags (
post_id BIGINT REFERENCES posts(id),
tag_id BIGINT REFERENCES tags(id),
PRIMARY KEY (post_id, tag_id)
);多対多のクエリ
すべてを結合するには、2回JOINします:
SELECT p.title, t.name
FROM posts p
JOIN post_tags pt ON pt.post_id = p.id
JOIN tags t ON t.id = pt.tag_id
WHERE t.name = 'sql';非正規化するタイミング
非正規化(データの重複)は、パフォーマンス向上のために使用されることがあります。計算済み合計のキャッシュ、全文検索用の列、マテリアライズドビューなどがその例です。まず正規化して設計し、計測したうえで非正規化してください。
JOINとサブクエリ
多くのJOINクエリはサブクエリで書き換えられ、その逆も可能です。読みやすい方を使用してください。最新のプランナーでは、同じ実行計画になることがよくあります。
外部キーは自動的には適用されない
REFERENCESを使って宣言する必要があります。外部キー制約があっても、外部キー列にインデックスを付けるのはあなたの仕事です。JOINのパフォーマンスのために、明示的にインデックスを作成してください。
まとめ
JOINは、整合性を保つためにテーブル間へ分割したデータを再構成します。
- 外部キーでリンクを宣言します
- クエリ実行時にJOINで正規化を元に戻します
- 1対多では「多」の側に外部キーを置き、多対多では結合テーブルを使用します
確認問題
usersとordersの1対多のリレーションシップでは、どちらのテーブルが外部キー列を持ちますか?
よくある質問
「なぜJOINが必要か(リレーショナルモデルの復習)」レッスンは無料ですか?
はい。「なぜJOINが必要か(リレーショナルモデルの復習)」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。
「なぜJOINが必要か(リレーショナルモデルの復習)」で何を学びますか?
リレーショナルモデル、正規化されたテーブル、外部キーを復習し、テーブル間のデータを再結合する橋渡し役がJOINである理由を学びます。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
SQL Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「なぜJOINが必要か(リレーショナルモデルの復習)」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSQL Academyレッスンでコードを書いて実行できますか?
はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- なぜJOINが必要か(リレーショナルモデルの復習)
- INNER JOINの仕組み
- LEFT/RIGHT JOINとOUTER JOIN
- 自己結合と別名