はじめに
社内のSQL講習会で学んだ「正規化」と「結合」について、自身の理解を整理するためにまとめました。
マスターテーブル と トランザクションテーブル の使い分けを意識しながら、スーパーの食材管理を例に解説します。
1. データベースの2つの役割
データを設計する際、テーブルは大きく分けて2つの種類に分類されます。
| 分類 | 役割 | 例 |
|---|---|---|
| マスター (Master) | 基礎となるデータ。頻繁には変わらない名簿のようなもの。 | 商品(りんご、キャベツ)、カテゴリなど |
| トランザクション (Transaction) | 日々の活動(出来事)を記録するもの。 | 今日の売上、入荷記録など |
2. 正規化とは?
正規化とは、データを整理して効率よく管理するためのプロセスです。
[Before] 非正規化のテーブル
一つのテーブルに、売上の事実と商品の詳細情報(単価・カテゴリ)が混ざっている状態です。
| 売上ID | 売上日時 | 商品ID | 商品名 | 単価 | カテゴリ | 数量 |
|---|---|---|---|---|---|---|
| 1001 | 2026-03-15 09:00 | P01 | りんご | 150 | 果物 | 2 |
| 1002 | 2026-03-15 09:15 | P03 | 牛乳 | 250 | 飲料 | 1 |
| 1003 | 2026-03-15 10:00 | P01 | りんご | 150 | 果物 | 1 |
| 1004 | 2026-03-15 10:30 | P02 | キャベツ | 200 | 野菜 | 1 |
問題点: この状態だと、商品の情報変更時に整合性が崩れる可能性があります。また、商品名やカテゴリを何度も書くのも非効率です。
3. 分割後のテーブル(Master & Transaction)
役割ごとにテーブルを分けることで、メンテナンス性を高めます。
① m_products(商品マスター)
商品の「基本情報」を管理します。
| 商品ID (PK) | 商品名 | 単価 | カテゴリ |
|---|---|---|---|
| P01 | りんご | 150 | 果物 |
| P02 | キャベツ | 200 | 野菜 |
| P03 | 牛乳 | 250 | 飲料 |
| P04 | 豚肉 | 400 | 精肉 |
| P05 | 食パン | 180 | 穀類 |
② t_sales(売上トランザクション)
「いつ、何が、いくつ売れたか」という事実のみを記録します。
| 売上ID (PK) | 売上日時 | 商品ID (FK) | 数量 |
|---|---|---|---|
| 1001 | 2026-03-15 09:00 | P01 | 2 |
| 1002 | 2026-03-15 09:15 | P03 | 1 |
| 1003 | 2026-03-15 10:00 | P05 | 1 |
| 1004 | 2026-03-15 10:30 | P02 | 3 |
| 1005 | 2026-03-15 11:00 | P04 | 1 |
4. 結合 (JOIN)して、データを1つに
正規化によってデータは複数のテーブルに分割されます。
そのため、必要な情報を取得する際には JOIN を使います。
JOIN を使うことで、別々のテーブルに保存された情報を関連付けて取得できます。
実行するSQL
SELECT
s.売上ID,
s.売上日時,
p.商品名,
p.カテゴリ,
p.単価,
s.数量,
(p.単価 * s.数量) AS 小計
FROM
t_sales AS s
INNER JOIN
m_products AS p
ON
s.商品ID = p.商品ID
ORDER BY
s.売上ID;
出力結果イメージ
| 売上ID | 売上日時 | 商品名 | カテゴリ | 単価 | 数量 | 小計 |
|---|---|---|---|---|---|---|
| 1001 | 2026-03-15 09:00 | りんご | 果物 | 150 | 2 | 300 |
| 1002 | 2026-03-15 09:15 | 牛乳 | 飲料 | 250 | 1 | 250 |
| 1003 | 2026-03-15 10:00 | 食パン | 穀類 | 180 | 1 | 180 |
| 1004 | 2026-03-15 10:30 | キャベツ | 野菜 | 200 | 3 | 600 |
| 1005 | 2026-03-15 11:00 | 豚肉 | 精肉 | 400 | 1 | 400 |
まとめ
データベース設計においても KISS (Keep It Simple, Stupid) は重要です。
- 1つのテーブルに1つのテーマを
- データは重複させない(1箇所直せば済むようにする)
- 出力時に必要な分だけ結合する
複雑に考えすぎず、情報を最小単位に整理することが、ミスのないシステム作りの第一歩だと感じました!
この記事が、同じようにSQL初学者の方の参考になれば幸いです。