今回はデータベースの正規化について解説していきたいと思います。
正規化の問題は基本情報処理試験、応用情報処理試験によく出題されます。
基本的には非正規形~第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正規形
あ