Forguncyでアプリを作成していると、「なんかテーブルがしっくりこないなぁ」って感じで、ページとテーブルを何度も行き来して、ページの開発中にテーブルを修正する。なんてことないですか?
この記事では「いい感じのテーブル」を作るための基本的な考え方、いわゆる正規化について紹介します。
このページでは以下のことがわかります!
- データベースで「いい感じのテーブル」を作るための基本的な考え方がわかる
- テーブルやフィールドを分ける理由と、その方法が理解できる
- 正規化を使って、無駄なく整理されたデータベース設計ができるようになる
このページの想定読者
- データベースの設計を始めたばかりの人
- 何度も同じデータを繰り返して書いてしまって困っている人
- 効率的にデータを管理したいと考えている方
いい感じのテーブルとは?
「いい感じのテーブル」をざっくり言うと、同じ情報を何度も書かなくていいように整理されたテーブルのことです。
例えば、システムを作った後に、おまけでグラフとか使って分析なんてことができると思うとワクワクしませんか?
そういったことができちゃうテーブルの状態が「いい感じのテーブル」とここでは呼んでます。
テーブルを分ける
一覧情報と詳細情報
たとえば、注文管理のアプリを作るとします。
そのとき、1回の注文で「商品が1つだけ」ってこと、あんまりないですよね?
たとえばこんな注文があったとします:
- 注文番号:0001
- 注文日:2025年4月10日
- お客さん:山田さん
- 商品A × 2個
- 商品B × 1個
- 商品C × 3個
これを1つのテーブルにまとめようとすると、1つの注文に複数の商品があるから、どうしても「同じ注文番号が何行も出てくる」感じになります。
| 注文番号 | 注文日 | お客さん名 | 商品名 | 数量 | 単価 |
|---|---|---|---|---|---|
| 0001 | 2025/04/10 | 山田太郎 | 商品A | 2 | 500 |
| 0001 | 2025/04/10 | 山田太郎 | 商品B | 1 | 800 |
| 0001 | 2025/04/10 | 山田太郎 | 商品C | 3 | 300 |
このとき、注文日やお客さんの名前が間違っていたときに、修正する行数が増えて、手間がかかります。
注文テーブルには:
注文全体に関わる情報を入れます。
| 注文番号 | 注文日 | お客さんID |
|---|---|---|
| 0001 | 2025/04/10 | 山田太郎 |
注文詳細テーブルには:
「注文の中身」を入れていきます。
| 注文番号 | 商品ID | 数量 | 単価 |
|---|---|---|---|
| 0001 | 商品A | 2 | 500 |
| 0001 | 商品B | 1 | 800 |
| 0001 | 商品C | 3 | 300 |
こうして分けておくと、1回の注文に何個商品があってもスッキリ整理でき、「商品別の売上を集計したい」とか「この商品が何回注文されたか知りたい」ってときにも対応しやすくなります。
マスター情報
次は「マスター情報」。聞いたことがあるかもしれません。
よく使う情報を集約したもののことを「マスター情報」と呼んだりします。
「商品マスター」や「部署マスター」が該当します。
先ほどの例でいうと、注文ごとに商品名の書き方が違っていると、検索や集計がしにくくなります。
| 注文番号 | 商品名 | 数量 | 単価 |
|---|---|---|---|
| 0001 | ボールペン | 2 | 100 |
| 0002 | ぼーるぺん | 1 | 100 |
| 0003 | ballpen | 3 | 200 |
商品マスターを作成すると、こういった入力ミスがなくなり、検索や集計しやすくなります。
| 商品ID | 商品名 | 定価 |
|---|---|---|
| P001 | ボールペン | 100 |
| P002 | ノート | 200 |
| 注文番号 | 商品ID | 数量 | 単価 |
|---|---|---|---|
| 0001 | P001 | 2 | 100 |
| 0002 | P001 | 1 | 100 |
| 0003 | P001 | 3 | 200 |
フィールドを分ける
フィールドを考えるときによくあるのが、ひとまとめにしちゃう問題。
たとえば、「氏名」を1つのフィールドにして「山田太郎」って入れるパターンです。
これ、見た目はスッキリしてるんですが、「名字だけで検索したい!」とか「名前順に並べたい!」ってときに困ります。
だから、「名字」と「名前」は別々のフィールドにしておいたほうが後々ラク。
例えば、こんなふうに分けておくイメージです:
| 名字 | 名前 |
|---|---|
| 山田 | 太郎 |
同じように、「住所」も「都道府県」「市区町村」「番地」に分けておくと、あとから「東京都だけのデータを抽出したい!」ってときにも便利です。
例えば:
| 都道府県 | 市区町村 | 番地 |
|---|---|---|
| 東京都 | 新宿区 | 1-2-3 |
| 長野県 | 松本市 | 4-5-6 |
「名前」とか「住所」を分けておくのは、めんどくさいようで、実は後々の自分を助けるための工夫なんです。
分けておけば、あとから必要に応じてくっつける(結合する)のは簡単ですが、分割するのは大変です。
例えば、住所から市区町村だけ抜き出すような数式やコマンドを作成するのはとても大変です。
そのため、最初から分けておく。という考え方が大事になってきます。

