1つのマス目に1つのデータを入れる「第1正規形」

1つのマス目に1つのデータを入れる「第1正規形」

 前のページで結合について述べましたが、結合をうまく行うためには、データを適切にテーブルに分ける必要があります。

 この作業のことを、「正規化」と呼びます。また、正規化には段階があって、「第1正規形」から「第5正規形」までがあります。ただし、一般には第3正規形までの正規化を行うことが多いです。

 例えば、文具の卸を行っている企業で、販売した商品に関するデータを表にして管理したいとします。単純に表にすると図3-1のような形になるでしょう。

 この表を見ると、1つの伝票に対して複数の商品があります。1件の伝票を1つの行に対応させるとすると、「商品番号」や「商品名」などの列では、1つのマス目に複数の値を入れる状態になります。

 このような状態をなくし、1つのマス目には1つのデータだけを入れるようにした形のことを、「第1正規形」と呼びます。

 第1正規形を作る際には、1つのマス目に複数の値が入る列を、元のテーブルから切り離して別のテーブルにします。そして、切り離した後のテーブルの、切り離す元のテーブルとの結合関係が分かるような列を作ります。

 表1の例だと、「販売先」までの列と、「商品名」から後の列とで、テーブルを2つに分けます。そして、商品に関するテーブルにも「伝票番号」の列を入れておいて、2つのテーブルを結合できるようにします(図3-2参照)。

重複するデータを2つのテーブルに分ける「第2正規形」「第3正規形」

 テーブルの列の中で、個々の行を識別するのに使える列(または列の組み合わせ)のことを、「主キー」と呼びます。

 例えば、図3-2の伝票メインテーブルでは、「伝票番号」列は行(個々の伝票)ごとに違った値になりますので、主キーになります。また、伝票サブテーブルでは、「伝票番号」列と「商品番号」列の値の組み合わせで個々の行を識別できます。したがって、これら2つの列の組み合わせが主キーになります。

 また、テーブルの列同士の間には、「ある列の値が決まると、別の列の値も決まる」という性質があります。例えば、図3-2の伝票メインテーブルでは、「伝票番号」列の値が決まると、「日付」列の値も決まります。このような関係のことを「関数従属」と呼びます。関数従属には、以下の3種類があります。

1)完全関数従属…ある列が主キーに関数従属する
2)部分関数従属…ある列が主キーの一部の列に関数従属する
3)推移的に関数従属…ある列が主キー以外の列に関数従属する

 例として、図3-2の2つのテーブルで、主キーの列と、列間の関数従属の関係を調べてみましょう。

 前述したように、伝票メインテーブルでは、主キー(「伝票番号」列)が決まると「日付」列の値も決まります。したがって、「日付」列は主キーに完全関数従属しています。同様に、「販売先番号」列も主キーに完全関数従属しています。

 一方、「販売先」列は「販売先番号」列によって決まる列で、主キーには直接には関数従属しておらず、推移的な関数従属の関係になっています。

 次に、伝票サブテーブルを調べてみます。このテーブルの主キーは、「伝票番号」列と「商品番号」列の組み合わせです。

 「個数」列は主キーで決まるので、完全関数従属です。一方、「商品名」列と「単価」列は「商品番号」列によって決まります。「商品番号」列は主キーの一部なので、「商品名」列と「商品番号」列の関係は、部分的関数従属です。また、「単価」列と「商品番号」列も部分的関数従属の関係です(図3-3参照)。

 部分関数従属や推移的な関数従属があると、1つのテーブルの中に同じ値を何度も入力する場面が出てきます。例えば、図3-2の伝票メインテーブルには、同じ販売先の情報を何度も入力する必要があります。

 部分関数従属している列を別のテーブルに分けると、「第2正規形」になります。また、推移的に関数従属している列を別のテーブルに分けると、「第3正規形」になります。ここまでの正規化を行うと、1つのテーブルに同じデータを何度も入力することがなくなり、無駄がなくなります。

 例えば、図3-2の2つのテーブルを第3正規形まで分解すると、図3-4の4つのテーブルに分かれます。伝票サブテーブルから商品の情報を分離すると、第2正規形になります。また、伝票メインテーブルから販売先の情報を分離すると、第3正規形になります。

 ここまでで第1回は終わりです。今回は、データベースとは何かというところから、現在の主流であるリレーショナルデータベースの考え方について解説してきましたが、いかがだったでしょうか。

 次回はSQLの基本について解説していく予定です。

【参考文献】

藤本壱『これだけは知っておきたいデータベースの常識』技術評論社(発行年:2009)

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30