Forguncyでアプリを作成していると、「なんかテーブルがしっくりこないなぁ」って感じで、ページとテーブルを何度も行き来して、ページの開発中にテーブルを修正する。なんてことないですか?

この記事では「いい感じのテーブル」を作るための基本的な考え方、いわゆる正規化について紹介します。

このページでは以下のことがわかります!

  • データベースで「いい感じのテーブル」を作るための基本的な考え方がわかる
  • テーブルやフィールドを分ける理由と、その方法が理解できる
  • 正規化を使って、無駄なく整理されたデータベース設計ができるようになる

このページの想定読者

  • データベースの設計を始めたばかりの人
  • 何度も同じデータを繰り返して書いてしまって困っている人
  • 効率的にデータを管理したいと考えている方

いい感じのテーブルとは?

「いい感じのテーブル」をざっくり言うと、同じ情報を何度も書かなくていいように整理されたテーブルのことです。

いい感じのテーブルがないとき

  • 様々なテーブルのデータに同じ更新をしなきゃいけない。
  • 検索やフィルターがかけにくい

いい感じのテーブルがあるとき

  • 他のシステムへ使いまわせる
  • テーブルを流用することで新しいテーブルを作る手間が省ける。

例えば、システムを作った後に、おまけでグラフとか使って分析なんてことができると思うとワクワクしませんか

そういったことができちゃうテーブルの状態が「いい感じのテーブル」とここでは呼んでます。

テーブルを分ける

一覧情報と詳細情報

たとえば、注文管理のアプリを作るとします。
そのとき、1回の注文で「商品が1つだけ」ってこと、あんまりないですよね?

たとえばこんな注文があったとします:

  • 注文番号:0001
  • 注文日:2025年4月10日
  • お客さん:山田さん
  • 商品A × 2個
  • 商品B × 1個
  • 商品C × 3個

これを1つのテーブルにまとめようとすると、1つの注文に複数の商品があるから、どうしても「同じ注文番号が何行も出てくる」感じになります。

注文番号注文日お客さん名商品名数量単価
00012025/04/10山田太郎商品A2500
00012025/04/10山田太郎商品B1800
00012025/04/10山田太郎商品C3300

このとき、注文日やお客さんの名前が間違っていたときに、修正する行数が増えて、手間がかかります。

注文テーブルには:

注文全体に関わる情報を入れます。

注文番号注文日お客さんID
00012025/04/10山田太郎

注文詳細テーブルには

「注文の中身」を入れていきます。

注文番号商品ID数量単価
0001商品A2500
0001商品B1800
0001商品C3300

こうして分けておくと、1回の注文に何個商品があってもスッキリ整理でき、「商品別の売上を集計したい」とか「この商品が何回注文されたか知りたい」ってときにも対応しやすくなります。

マスター情報

次は「マスター情報」。聞いたことがあるかもしれません。

よく使う情報を集約したもののことを「マスター情報」と呼んだりします。

「商品マスター」や「部署マスター」が該当します。

先ほどの例でいうと、注文ごとに商品名の書き方が違っていると、検索や集計がしにくくなります。

注文番号商品名数量単価
0001ボールペン2100
0002ぼーるぺん1100
0003ballpen3200

商品マスターを作成すると、こういった入力ミスがなくなり、検索や集計しやすくなります。

商品ID商品名定価
P001ボールペン100
P002ノート200

注文番号商品ID数量単価
0001P0012100
0002P0011100
0003P0013200

コツは「同じ情報がでてきたとき」

2つの例を挙げましたが、どちらにも共通しているのが、同じ情報を別のテーブルに分けている点。
こうすることで、更新時の手間がなくなるのと、

フィールドを分ける

フィールドを考えるときによくあるのが、ひとまとめにしちゃう問題

たとえば、「氏名」を1つのフィールドにして「山田太郎」って入れるパターンです。

これ、見た目はスッキリしてるんですが、「名字だけで検索したい!」とか「名前順に並べたい!」ってときに困ります。

だから、「名字」と「名前」は別々のフィールドにしておいたほうが後々ラク。

例えば、こんなふうに分けておくイメージです:

名字名前
山田太郎

同じように、「住所」も「都道府県」「市区町村」「番地」に分けておくと、あとから「東京都だけのデータを抽出したい!」ってときにも便利です。

例えば:

都道府県市区町村番地
東京都新宿区1-2-3
長野県松本市4-5-6

「名前」とか「住所」を分けておくのは、めんどくさいようで、実は後々の自分を助けるための工夫なんです。

分けておけば、あとから必要に応じてくっつける(結合する)のは簡単ですが、分割するのは大変です。

例えば、住所から市区町村だけ抜き出すような数式やコマンドを作成するのはとても大変です。

そのため、最初から分けておく。という考え方が大事になってきます。

【著者】

sasayaki@メシウス社員

すべてのシゴトをデータで繋ぐ!

【メシウス社員です】
Forguncyを作ってる側の人間ですが、このコミュニティでは「いちユーザー」としても楽しみながらお邪魔しています!公式サポートではないですが、知ってることは共有したり、相談に乗ったりできたら嬉しいです。
※あくまで「個人の意見」なので、製品への要望や不具合の報告は、公式のサポート窓口も併せてご利用ください!