SQLとデータベース正規化とは?基礎をやさしく解説

SQLとデータベース正規化とは?基礎をやさしく解説

SQLと正規化の学習でつまずくビジネスパーソンのイメージ
「SQLって、何をするための言語なの?」
「データベースの正規化って、なぜ必要?」
「第3正規形って、試験でよく出るけど難しい」

1人の引っ越しで、住所を何か所も書き直す——そんな面倒を根本からなくすのが、正規化の発想です。

SQLとはデータベースを操作する共通言語、正規化とはデータの重複をなくして整理する設計手法です。SQLで日々データを出し入れし、正規化で崩れない土台を先に作る。この2つは、データベースの両輪です。

 

この記事では、SQLの中心となる3つの命令を押さえ、正規化がなぜ要るのかを実際の表で示し、第1〜第3正規形を1つの表を分割しながら段階でたどります。最後に、目の前の表が第何正規形かを見分ける手順まで示します。基本情報技術者のデータベース対策に効きます。基礎概念は データベースとは でも整理しています。

 

1. SQLでできる4つのこと

SQLでデータベースを検索・追加・更新・削除するイメージ

業務システムでデータを扱う場面、その裏側ではほぼSQLが動いています。SQL(Structured Query Language)は、関係データベース(RDB)を操作するための標準言語で、ISOやJISで標準化され、主要なRDB製品を共通の構文で扱えます。あなたが「何が欲しいか」を宣言的に書くと、結果が返ってくるのが特徴です。

 

SQLの操作は大きく4つ。検索・追加・更新・削除です。中でも試験で問われやすい3つの読み出し命令を、あなたはまず押さえておきましょう。取り出す・つなぐ・まとめる、という3つの動きです。

 

取り出すのがSELECT、複数の表をつなぐのがJOIN、グループごとに集計するのがGROUP BYです。たとえば「顧客表から名前と年齢を取り出す」「顧客表と注文表を顧客IDでつなぐ」「商品ごとの注文件数を数える」といった要求を、この3命令で表します。条件を絞りたいときは「年齢が30歳以上だけ」のように範囲を指定する句を足す、という具合に、あなたは欲しい結果を言葉で組み立てていきます。そして正規化で複数の表に分けたデータを、意味のある形に組み立て直すのがJOINの役目です。つまりSQLと正規化は、表裏一体で効いています。データを分けて保つ(正規化)から、つなぎ直す命令(JOIN)が要る、という関係です。

 

2. なぜ正規化が要るのか

重複したデータが引き起こす矛盾を整理するイメージ

正規化が苦手なあなたも、目的さえ掴めば一気に進みます。正規化とは、表の構造を整理して、データの重複や矛盾をなくす設計手法です。設計段階で行います。

 

感覚が近いのは、古い住所録の整理です。同じ会社名や住所が何度も書き写されていると、1人が引っ越しただけで何か所も直す必要が出る。1か所でも直し忘れれば、記録は矛盾します。同じ事実をあちこちに書かない——正規化が目指すのは、まさにこの状態です。

 

重複を放置すると、あなたの手元で3つの困りごとが起きます。同じデータでディスクを無駄に使う、同じ情報が複数箇所にあって食い違う、更新のとき一部だけ書き換わって不整合になる。正規化のゴールは一言で言えば、「1つの事実は1か所にだけ書く」。これを守れば、追加・更新・削除のどれをしても、データの食い違いが起きにくくなります。

 

正規化は、あくまで矛盾を生まない土台づくりです。更新の途中で処理が失敗しても記録を壊さない仕組みは、また別の話で、トランザクションとACIDとは が担います。設計(正規化)と実行時の安全(トランザクション)は、両輪で整合性を守ると押さえておくと、あなたのデータベース像が立体的になります。

 

3. 1つの表を、段階で分けていく

非正規形から第1第2第3正規形へ段階的に分割するイメージ

言葉だけでは掴みにくいので、あなたと一緒に1つの「注文表」を実際に分割してみます。出発点は、1行にあれこれ詰め込んだ、こんな表です。

 

注文ID 顧客名 商品(複数) 部署コード 部署名
1 田中 ペン, ノート D01 営業部

 

第1正規形は、1つのセルに複数の値を入れない状態です。「ペン, ノート」を1行1商品に分け、1セル1値へ直します。これで表計算的な繰り返しが消えます。

 

第2正規形は、第1を満たしたうえで、主キーの一部だけで決まる項目(部分関数従属)を別表へ切り出す状態です。「注文ID+商品ID」が主キーの注文明細で、商品名は商品IDだけで決まります。だから商品名は「商品マスタ」へ移します。

 

第3正規形は、第2を満たしたうえで、主キー以外から間接的に決まる項目(推移関数従属)を別表へ切り出す状態です。上の表の「部署名」は、主キーではなく「部署コード」に従って決まります。だから、部署コードが同じ行にはどれも同じ部署名が繰り返し書かれ、これが重複と矛盾の温床になります。しかも部署名を変えるたびに、その部署の全注文行を書き直すはめになります。部署名を部署マスタへ独立させ、注文側には部署コードだけを残す。こうすれば、部署名の変更は部署マスタの1行を直すだけで済みます。分割後は、次のように役割ごとの表に整います。

 

正規形 やること 上の表での操作
第1 1セル1値にする 「ペン, ノート」を行に分ける
第2 部分関数従属を除く 商品名を商品マスタへ
第3 推移関数従属を除く 部署名を部署マスタへ

 

4. 第何正規形かを見分ける手順

表を見て第何正規形かを順番に判定するイメージ

試験では「この表は第何正規形か」「次の正規形にするにはどう分割するか」が問われます。あなたは次の順で、上から機械的に確かめれば答えにたどり着けます。

 

  1. 1セル1値か? — 複数値が入っていれば、まだ非正規形。分ければ第1正規形
  2. 主キーの一部だけで決まる項目はないか? — あれば部分関数従属。切り出せば第2正規形
  3. 主キー以外から決まる項目はないか? — あれば推移関数従属。切り出せば第3正規形

 

見分けの合言葉は「1セル1値 → 部分従属を除く → 推移従属を除く」の3ステップです。あなたがこの順を口に出して確認すれば、第2と第3の取り違えも起きません。どの従属を除いた段階かで、正規形の番号が決まるからです。

 

SQLと正規化は、基本情報技術者のデータベース領域でほぼ毎回出ます。SELECT・JOIN・GROUP BYで「取り出す・つなぐ・まとめる」、正規化で「1つの事実は1か所」。この2本の柱を持てば、あなたはデータベースの設問を安定して得点源にできます。名前で覚えるより、動きと目的で押さえるほうが、初見の問題にも強くなります。身近な表を実際に手で分けてみる経験が、遠回りに見えていちばんの近道です。

 

次のステップ

SQLと正規化がどの科目で問われるかは、基本情報技術者試験の全体概要と学習計画ガイド で、データベース領域の位置づけを先に押さえられます。

正規形の判定は、基本情報技術者 データベースの問題集 で、SQLと正規化の設問を解くと記憶に残ります。