データベース

データベースの正規化を理解しよう

今回はデータベースの正規化について解説していきたいと思います。
正規化の問題は基本情報処理試験、応用情報処理試験によく出題されます。
基本的には非正規形~第3正規形までを理解しておくとよいです。


関係データベースとは

関係データベースとはデータを複数の表(テーブル)として管理し、行(レコード)と列(フィールド、属性)で表同士の関係を定義することで複雑なデータの関係性を扱えるようにしたデータベースの管理方式です。
SQLServerやPostgreSQL、Oracleなどが関係データベースに該当します。
基本的に情報処理試験でデータベースといえば関係データベースを表すと思っておけばよいです。

正規化とは

データベースの正規化とはデータの重複を最小限に抑えデータの一貫性や完全性を確保するためのデータ設計の手法です。

非正規化

まずは非正規化の状態のデータがどんなものなのかを理解しましょう。
最近はITの導入も進んでおりなかなか非正規化の状態のデータに触れることがすくないためより正規化の理解をしにくくなっていると思います。
非正規形状態のデータを見ることでなぜ正規化する必要があるのか?の理解がより深まります。
まずは下の画像の受注伝票を見てみましょう。

この伝票の主キーは「受注伝票番号」の「T00001」です。
この伝票番号に対する1つのレコードとなるようにデータ設計をすると以下のようになります。

受注伝票番号 発注先名 TEL 住所 NO 商品ID 商品名 数量 金額 仕入れ先ID 仕入れ先 NO 商品ID 商品名 数量 金額 仕入れ先ID 仕入れ先 NO 商品ID 商品名 数量 金額 仕入れ先ID 仕入れ先 NO 商品ID 商品名 数量 金額 仕入れ先ID 仕入れ先 NO 商品ID 商品名 数量 金額 仕入れ先ID 仕入れ先 NO 商品ID 商品名 数量 金額 仕入れ先ID 仕入れ先 NO 商品ID 商品名 数量 金額 仕入れ先ID 仕入れ先 合計
T00001 赤城商事株式会社 090-●●●●-▲▲▲▲ 長野県長野市中御所町2-3-6 1 S0001 りんご 2 150 300 U0001 肥田商店 2 S0002 みかん 3 50 150 U0002 田野青果 3 S0003 すいか 4 500 2000 U0001 肥田商店 4 S0003 すいか 4 450 1800 U0002 田野青果 5 S0004 かぼちゃ 2 120 240 U0002 田野青果 6 S0005 トマト 5 100 500 U0002 田野青果先 7 S0006 れもん 6 80 480 U0001 肥田商店 5470

このデータ設計だと項目の「NO」「商品ID」 「商品名」 「数量」 「金額」 「計」 「仕入れ先ID」「仕入れ先」がくり返し登場しています。
このようにリレーショナルデータベースの世界では同じ項目がくり返し登場することが非常に都合が悪いデータ設計となります。

第1正規形

第2正規形


第二正規化

第3正規形