データベーススペシャリスト資格|2022年10月挑戦ログ 7月4日|DB基礎知識(正規化)|SQL(確認ドリル)

高度IT・基礎知識

この記事は「データベーススペシャリスト資格に興味はあるが、どのようなものか?どう学ぶのか?」という方向けに、具体的な内容と私自身の挑戦ログをお伝えする。学び中の方や、これから学ぼうとされる方の参考になれば幸いだ。今回は知識および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
  • 大人の週末起業/藤井 孝一/株式会社インプレス

コメント

タイトルとURLをコピーしました