2020年4月のDBスペシャリストを受験することにしました。
データベーススペシャリスト試験(DB) ~ ビッグデータ時代に求められる、データ志向の担い手 ~
ということで今回は正規化についてまとめていこうと思います。
正規化
Wikipediaでは正規化はこう定義されています。
関係データベース (リレーショナル・データベース) において、正規形と呼ばれる形式に関係(リレーション)を準拠させることにより、データの一貫性の維持と効率的なデータアクセスを可能にする関係設計を導くための方法である。正規形には様々なものが存在するが、いずれにせよ、正規化を行うことにより、データの冗長性と不整合が起きる機会を減らすことができる。
https://ja.wikipedia.org/wiki/%E9%96%A2%E4%BF%82%E3%81%AE%E6%AD%A3%E8%A6%8F%E5%8C%96
データの冗長性を防ぎ、効率的なデータアクセスを可能にするテーブル設計を行いましょう、ということですね。
でも実際に仕事でテーブル設計をするとき、これだとテーブルアクセスが増えすぎて処理速度が落ちる、ということも多いので、必ずしも正規化するが正しいとは言えないのです。
正規化が行われていない状態を非正規系、正規化が行われている状態を正規系といいます。
正規化の段階
正規化の段階は全部で7つあります。
- 非正規系
- 第一正規系
- 第二正規系
- 第三正規系
- ボイス・コッド正規系
- 第四正規系
- 第五正規系
データベーススペシャリスト試験で頻出するのは第一〜第三正規系ということで、本記事では非正規化〜第三正規系についてまとめていきます。
非正規系
下記のような状態の非正規系といいます。
特徴
- 属性が繰り返し項目となっている
このテーブルでは売上明細とその内容が繰り返しとなっています。このような状態は正規化が全く行われていないと表現され、非正規系と呼ばれます。
非正規系である理由
データベーススペシャリスト試験では「このテーブルが○○正規系である理由を述べよ」という問題が頻出します。この非正規系である理由は下記のように答えます。
売上明細が繰り返し項目であり単一値ではないため
必ず属性名を記すこと、そして単一値ではないという言葉を入れるのが重要です。
第一正規系
では、上の非正規系に第一正規化をかけてみます。
これが第一正規系です。非正規化の時の売上の繰り返しをなくし、1行に1つの売上明細が記録されるようにしました。
第一正規系である理由
非正規系と同じくこれもよく問われます。しかし、非正規系と違って、ここでは非正規系ではなくさらに第二正規系ではない理由を述べる必要があります。
このテーブルが第一正規系である理由は下記のように回答できます。
全ての属性が単一値で候補キー{伝票番号、商品コード}の一部である商品コードに非キー属性の商品名が部分関数従属するため
- 全ての属性が単一値=非正規系ではない理由
- 部分関数従属がある=第二正規系ではない理由
第二正規系
第二正規系では第一正規系にある部分関数従属を解消する必要があります。
上の第一正規系の部分関数従属している箇所を別テーブルで管理させます。すると次のようになります。
第二正規系である理由はこう書くことができます。
全ての属性が単一値で、候補キーに部分関数従属がなく、推移的関数従属性 伝票番号→担当者ID→担当者名が存在するため
担当者データの他にも店舗データにも推移的関数従属性はあります。1つでも推移的関数従属性があれば第三正規系ではない理由になるのでどちらを書いてもよいです。
第二正規系の特徴は
- 全ての属性が単一値 = 非正規系ではない理由
- 部分関数従属がない = 第一正規系ではない理由
- 推移的関数従属がある = 第三正規系ではない理由
が挙げられます。
第三正規系
第三正規系では第二正規系の推移的関数従属性を解消する必要があります。
このテーブルの推移的関数従属性は担当者の情報にあります。売上ヘッダテーブルでは担当者IDのみ知っていればよいので、ここを分解してあげます。
第三正規化を施すと次のようになります。
売上ヘッダテーブルから店舗情報と担当者情報が切り出されて別テーブルになっています。
しかし、ここでもう1つ第二正規系と違うところがあります。それは、導出項目の排除です。
導出項目の排除
導出項目とは、計算によって導き出された項目になります。第二正規系の時にあった小計、消費税、合計などがそれです。
第三正規化ではこの導出項目の排除も行います。
第三正規系である理由は次のように答えることができます。
全ての属性が単一値で、候補キーからの部分関数従属性がなく、候補キーからの推移的関数従属もないため
- 全ての属性が単一値 = 非正規系ではない理由
- 部分関数従属性がない = 第一正規系ではない理由
- 推移的関数従属性がない = 第二正規系ではない理由
となります。
まとめ
データベーススペシャリスト試験でよく問われるのはこの非正規系から第三正規系のものが多いのでここさえ押さえていれば大丈夫だと思います。過去問もかなりやっていますがボイスコッド以降が回答になる問題はまだ見たことがありません。
記述ではテーブルの正規系とその理由について問われるものがあります。記述なので苦手な人も多いかと思いますが、各正規系の特徴をしっかり記載すれば満点狙えると思います。テンプレ的に暗記は大事です。そして、候補キーとそこからの関数従属を見抜く力を養いましょう。これは練習でなんとかなると思っています。
最後までお読みいただきありがとうございました。