公開日2020.05.18
最終更新日2022.05.02
はじめに
今回は、関係データベースの正規化について、第1正規形・第2正規形・第3正規形をご紹介をしていきます。自分の見解を言語化するのがあまり得意な方ではありませんが、自分なりに必死に説明をしていきますので、ぜひお付き合いいただければと思います。
関係データベースとは
データを複数の表(テーブル)として管理し、行(レコード、組、タプル)、 列(フィールド、 属性)で表と表の関係を定義することで、複雑なデータの関係性を扱えるようにしたデータベース管理方式を指します。Relational DataBase(リレーショナルデータベース)、略してRDBとも呼ばれています。
Oracle、MySQL等のデータを表形式で管理するデータベースが該当します。
正規化とは
データの一貫性の維持と効率的なデータアクセスを可能にする関係設計へ導くための方法を指します。データに矛盾や重複を生じさせないことを目的とし、様々な正規化が使用されています。そして正規化された表のことを正規形と呼びます。
正規化の種類
正規化の段階には、第1正規化~第5正規化、およびボイス・コッド正規化やドメイン・キー正規化などがあります。段階を踏んでいく毎に細分化されていく、とというようなイメージを持っていただければと思います。
今回は、データベースを設計する際に一般的に用いられ、基本情報技術者試験の出題範囲にも取り上げられている第1正規形、第2正規形、第3正規形への正規化をご紹介していきます。
非正規形
まず正規化を説明するにしても、正規化されていない非正規形のサンプルが必要でありますので、下記に例として受注伝票を3枚用意しました。これらを使って非正規形の表を作っていきます。
この受注伝票1枚が1件のレコードに相当するとし、並べてみます。
レコードとして並べてみると、このような表になります。
上図のように1行の中に複数の繰り返し項目が存在するような表は非正規形と呼びます。
これでは各レコードの長さがバラバラで、素直な2次元の表になっていません。関係データベースでは、縦方向(レコード)としてデータを追加していく操作には適しておりますが、横方向へ増える非正規形の表は管理することができないため、正規化をしていく必要があります。
第1正規形
第1正規形とは
非正規形の表から、繰り返し部分が取り除かれたものを第1正規形とします。
正規化
非正規形の表の横方向に伸びた繰り返し部分を切り離し、縦方向に並べ横方向の重複をなくす方法が第1正規化となります。また、金額項目のような計算で求められる列は、記録する必要がないので取り払います。
第1正規化で重要なのは、各繰り返し部分に1つずつ独立したレコードを作り、横方向の長さを統一する、ということです。
第2正規形
第2正規形とは
第1正規形の表から、部分関数従属している列が切り出されたものを第2正規形とされています。
まず正規化の前に、第2正規形では関数従属と部分関数従属というのが関わってくるため、これらに触れていきます。
関数従属とは。主キーが決まると、列の値が一意に定まる関係のことを呼びます。
部分関数従属とは。複合キーの一部の項目だけで、列の値が一意に定まる関係のことを呼びます。第1正規形においては、主キー(複合キー)からレコードを特定が可能ですが、主キーの一部分に対して、上記の関数従属する項目のため、部分関数従属と呼ばれているようです。
これらは決して難しい言葉ではないかと思いますが、主キーに対して、その項目がどんな関係にあるかをあらわす言葉と思っていただければと思います。
正規化
上図では、第1正規形の表の部分関数従属している列を切り出し、従属関係を分離し、表を3つに分けています。このような方法が第2正規化となります。
第2正規化で重要なのは、第1正規形にて明細が繰り返される度に重複していたデータを分離するということです。
第3正規形
第3正規形とは
第2正規形の表から、主キー以外の列に関数従属している列が切り出されたものを第3正規形とされています。
補足として、主キー以外の列に関数従属している列のことを推移的関数従属と呼ばれていたりします。
正規化
上図では「受注No.」を主キーとし、主キー以外の列に関数従属している列を切り出し、「受注票」から2つの表に分け、全部で4つの表に分けています。このような方法が第3正規化となります。
第3正規化で重要なのは、更に分離できる部分を分離するということです。分離した表に追加情報等も付けやすくなり、より管理効率が上がります。
正規化によるメリット・デメリット
メリット
- データ管理(保守)が容易になる
- データの共通性(汎用性)が向上する
- データ容量を削減できる
デメリット
検索内容によってはパフォーマンス能力が低下するケース、または意図的に正規化を行わない方が性能が良いケースもあります。そのため、データ検索・データ更新の頻度や表の関係性など、実際の業務バランスを見て正規化を行う必要があります。
さいごに
ざっくり正規化について説明をさせていただきましたが、これがデータベースの正規化となります。正規化の目的として順番に正規化を進めることにより、効率的に管理できる表を作っているというのが重要です。
今回は第3正規形までしか紹介しませんでしたが、実際の業務上使用するデータベースの正規化は、第3正規形まで覚えておけばだいたい大丈夫と言われてたりします。
関数従属とか難しく感じる言葉もでてきましたが、こればかりは例をいくつか見て身につけていくしかないのかなと思います。
下記リンクの基本情報技術者試験ドットコム、午後問題でいくつか出題例があるので、イメージを付けやすくするため、ぜひ参考にしてみてください。
外部リンク:基本情報技術者ドットコム 午後問題の分野別まとめ