この記事は「データベーススペシャリスト資格に興味はあるが、どのようなものか?どう学ぶのか?」という方向けに、具体的な内容と私自身の挑戦ログをお伝えする。学び中の方や、これから学ぼうとされる方の参考になれば幸いだ。今回は知識およびSQL(確認ドリル)について書く。(SQLはGoogle Big Queryに準拠)
知識(正規化)
基本的な考え方
- 正規化とは、データベースを設計する際に考慮する事項。英語で言うとnormalization。
- 目的は、不整合の発生を防ぐこと。言い換えると、冗長性を排除すること。
- 冗長性とは、同一の事実関係をあちこちに書く事。これを排除するとは、たとえば「社員№1は、氏名タロウだ」という情報は「社員表」など一つのテーブルでのみ管理するなど。
- 冗長性を排除するには、正規化のプロセスに沿って表を分割すること。
- 基本的には第三正規形までが実務で用いられ、試験でも聞かれるのはここまで。(近年でも実務的な所が問われるので)
- 非正規形~第三正規形までは”関数従属”に着目して表を分割していく。これ以降は知識レベルで良いが(午前2試験で問われたら答えられるくらい)、ボイス・コッド正規形(関数従属に着目)、第四正規形(多値従属)、第五正規形(結合従属)となる。
第一正規形
- 非正規形(繰り返し項目を持つ)を解消したもの。
- 表においては、一つのセルに一つの値しか持たないような状態。
- たとえば、受注伝票をそのまま表形式にすると、伝票のヘッダー(受注№、受注日、顧客№、顧客名)に、複数の明細(商品番号、商品名、単価、数量、金額)がぶら下がる。
- しかし、このままでは例えば受注№が定まるとき、明細のどこを見れば良いか一意に定まらない。
- よってまず第一正規形では、「伝票のヘッダー+明細」をそれぞれ一つの行として扱えるよう、表を書き換える。
- なお、この時点ではまだ”ごった煮テーブル”であり、意味のあるまとまりに分割していく必要がある。
- そうしないと困ること(更新時異常)については過去記事参照。
第二正規形
- 部分関数従属を取り出したもの。たとえば受注伝票であれば、各エンティティの関係は以下図のようになる。
- {受注№、品№}は主キーであり、{数量、金額}含むすべての項目を定められる。(赤枠部分)
- このとき、{受注日、客№}は{受注№}に、{品名、単価}は{品№}によってのみ定まるので、これらは部分関数従属となる。(青線部分)
- よって{受注№、受注日、客№、客名}は”受注表”、{品№、品名、単価}は”商品表”として別表にする。
- 試験対策として覚えておくべきは、この時点で起きる不整合は、第三正規形(推移関数従属)に係るものであるということ。たとえば「客名を登録したいとき、わざわざ”受注表”を作らねばならない」など。
第三正規形
- 推移関数従属を取り出したもの。たとえば上図であれば、{客名}は{客№}によって定まる(緑線部分)。
- よって{客№、客名}の”顧客表”として別表にする。
試験問題例
- {受注番号,商品コード}を主キーにする表がある。受注番号→得意先コード、商品コード→単価のとき、これは第何正規形か。答えは第1正規形。部分関数従属が残っているので、第2正規化はされていない。(H27問6)
- 次のうち、第2正規形どまりのものはどれか。①{学生番号,講義名}を主キーにし、学生番号→成績、講義名→担当教育の表。②社員番号を主キーにし、他が一意に定まる表。③社員番号を主キーにし、他が一意に定まるが、所属コード→勤務地の推移関数従属がある表。④繰り返し項目がある表。答えは③。部分関数従属は無いが、推移関数従属はあるので。(R2問5)
- 第3正規形において存在する可能性ある関数従属はどれか。答えは「候補キーの真部分集合(内包され合致はしない部分)から、他の候補キーの真部分集合への関数従属」。{a,c}が候補キーかつ、a↔bの表(つまり{b,c}も候補キー)をイメージすると良い。(H31問8)
9月22日復習時追記
- 正規化は、午前2では数問出題されるのみであり、対策済。
- 午後については「基礎理論」として過去問ベースで確認しており、対策済。
問題055(SQL確認ドリル)
問題文
- 「customers」テーブルから、月曜日に生まれた、もっとも年齢の高い顧客について、
- 顧客ID(user_id)、氏名(name)、誕生日(birthday)を取得してください。
format_date関数のおさらい
- format_dateは元のデータ型を変えずに、その表示形式を柔軟に変えることができる。
- たとえば「format_date(”%a”,birthday)」とすれば、誕生日について省略された曜日名(Monなど)が取得できる。
- これを利用して、月曜日生まれの顧客を抽出する。
- 具体的には以下のとおり。
考察
- データベーススペシャリスト資格について。今回は正規形について復習した。例えば第二正規形なら、推移関数従属(第三正規形で解決)に係る更新時異常が問題となる点は注意だ。また、SQLの確認ドリルを解いた。お題は「誕生日が月曜日の最高齢顧客」だ。
- 考察。私は現在、主に自分の学びと表現の研磨のためブログ×Twitterによる情報発信を行っている。これ自体に多くの学びがあり、今後も継続したい。そして、将来的には発信した情報の蓄積(または電子書籍など)を「専門性の証明」として、副業に役立てたいとも考えている。
考察のシンプル化と英訳(練習中)
- I believe the stock of blog can become proof of expertise.
- (蓄積されたブログは、専門性の証明になると思います)
参考資料
- 集中演習 SQL入門/木田和廣/株式会社インプレス
- 2022年度版 ALL IN ONE パーフェクトマスター データベーススペシャリスト/TAC
- 大人の週末起業/藤井 孝一/株式会社インプレス
コメント