DE51:正規化手法【データサイエンティスト検定(リテラシーレベル)補習ノート】
データサイエンティスト検定(リテラシーレベル)の公式リファレンスブックで躓いたところをまとめていきます。
データベースを使った経験がほぼゼロなので、正規化手法と聞いてもなんのことだかさっぱりわかりませんでした。ちなみにデータの範囲を0~1の間に収めることではありません(汗)。これは試験にでるとキツイ。。。ということで、自分のような初歩レベルが理解した形でまとめておきます。不正確な部分があるかもしれませんがご容赦ください。
第一正規化
レコード単位の情報にばらすこと。
のようなデータがあったときに
のようにレコード単位のデータに変換する。これはわかりやすいです。
第二正規化と第三正規化の違いがわからない・・・
厄介なのが第二正規化と第三正規化です。
どちらも、あるカラムが決まると、自動的に値が決まる別のカラムが存在しないようにすること、のようにみえます。たとえば、
のようなデータがあったとします。(候補キーは注文IDと商品ID)
商品名や単価は商品IDから自動的に決まります(従属している)。また、顧客名は顧客IDから自動的に決まるので、どれか1つだけ残すことだと最初は解釈しました。
商品IDや注文IDで決まるほかのカラムを削除して・・・
のような感じになるかなと。→これは間違い!
先に候補キーを理解する
候補キーはMySQLなどのRDBでは主キーと呼ばれるようです。Webで調べていると主キーと書いてある記事も多いので注意します。
候補キーというのは、あるテーブルのレコードを特定するための識別子です。候補キー以外のカラムは非キー属性と呼びます。まずは候補キーを決めないと第二正規化はできません。
第二正規化は部分従属している属性を分離する作業
部分関数従属とは、非キー属性のカラムが候補キーの一部に関数従属している状態のことです。(候補キーの全項目を使って値が決定する関係は、完全関数従属です)
テキストでは「第二正規化は、第一正規化が行われた状態で、部分関数従属が存在しない状態にすることです」と記載されています。自分の読解力のなさで、これを「部分関数従属を削除する」と捉えてしまったのがそもそもの誤りでした。削除するのではなく、分離するのが正解でした。
ということで、先の例で候補キーを注文IDと商品IDとして、第二正規化を実施していみます。まず1個目の候補キー「注文ID」に従属している部分を考えると、商品IDと顧客名、そして日付が該当しますので、これを分離します。
また、2個目の候補キー「商品ID」に従属している部分は商品名と単価ですので、これを分離します。
最後に数量が残っています。これは注文IDにも商品IDにも従属しているので、2つの候補キーとともに分離します。
下記の記事がわかりやすく解説していますので、ご覧ください。
http://ext-web.edu.sgu.ac.jp/HIKO/Prog03/SenpaiKyozai/shiohara/formalize.html
第三正規化は推移従属している属性を分離する作業
第二正規化したデータを見てみると、顧客IDが決まれば顧客名は自動的に決まるはずです。ただし顧客IDは従属キーではなく非キー属性なので、部分関数従属ではなく推移従属関係と呼びます。これを分離するのが第三正規化です。
ということで、顧客名を分離します。
これで第三正規化できました。
第一正規化→第二正規化→第三正規化の順番
ここまで見てきたように、正規化は第一正規化→第二正規化→第三正規化の順番で行う必要があります。第一、第二、第三は順番の意味だったのですね。。。
テキストによると、正規化をすることで冗長性が軽減され不整合は減るものの、テーブルが複数できるので検索効率は悪化するとのこと。万能な手法はないってことかもしれません。
参考資料
この記事が気に入ったらサポートをしてみませんか?