Shoeisha Technology Media

資格Zine(しかくジン)

記事種別から探す

リレーショナルデータベースの概要~正規化とER図

  • LINEで送る
  • このエントリーをはてなブックマークに追加
林 優子[著]
2017/01/24 08:00

 12cSQL試験では、データモデリングに関する知識を持っていないと難解に感じる出題がちらっとだけあります。Oracleの試験だから、Oracleのことだけ分かっていればいいかというとそうはいかないのです。「毎日忙しくて、勉強する時間なんて作れません。日々の仕事の内容を理解するだけで精一杯です」という人は多いことでしょう。分かりますよ、その状況。でもね、Oracleはデータベースソフトウェアですから。データベース全般の知識がベースにないといけないのです。。。

正規化

「正規化」をご存じでしょうか? SI業務を行っていらっしゃる企業の新入社員研修では、「データベース設計」という講座が含まれている場合が多いのですが、それ以外の企業ではSQLだけ教えたらすぐ、Java研修に突入というカリキュラムが多いような気がします。それでも、情報処理試験で出題されることがあるので、独学した(けど、よく分かっていない)という人が多いようです。

12cSQL試験で、正規化そのものが出題されるわけではないのですが、正規化とそこで用いられる用語が理解できていないと「この問題、何を言っているのだろう」とチンプンカンプンな出題が2問くらいあるだろうと思います。たかが2問ですが、想像もつかなかった出題があると点を失うだけでなく自信をなくしてしまい、他の出題に対する回答にまで悪い影響を与えます。せめて、用語だけでいいので、慣れておいてください。

表1:正規化
関数 説明
第一正規化 繰り返しの排除
第二正規化 部分関数従属の排除(完全関数従属)
第三正規化 推移関数従属の排除

ここで見慣れておいてほしいのが、「完全関数従属」「推移関数従属」という言葉です。

関数従属

関数従属性をWikipediaで調べると、「関係(表)の2つの属性集合間で、一方の属性集合の値(の集合)がもう一方の属性集合の値(の集合)を関数的に決定する」とあります。

「関数的に決定する」って、何それ? かもしれませんね。

言い換えると「属性Xの値が決まるとき、属性Yが一意に決まる」、つまり「社員番号が分かれば、社員氏名が明らかになる」というのが関数従属です。したがって、「社員氏名は、社員番号に関数従属である」つまり「属性Yは、属性Xに関数従属である」という言い方もします。

では、「関数従属」の前に「完全」が付くとどう変わるのでしょうか。

完全関数従属

完全関数従属(あるいは完全従属)とは、「属性Xに対して、属性Yが関数従属していて、Xの一部の属性に部分従属していない。Xが属性A+B+Cで構成される場合、いずれの構成要素および構成要素の組み合わせ(A、B、C、AB、AC、BC)にも関数従属しないYは、Xに完全関数従属している」といいます。

分からない? そうですね、例えば次のデータがあるとしましょう。

例1:勤怠実績表
社員番号 プロジェクト番号 日にち プロジェクト名 投入時間
1001 P002 2016-10-01 SMILEプロジェクト 5.0
1001 P080 2016-10-01 部内会議 1.5
1001 P099 2016-10-01 事務手続き 1.5
1002 P013 2016-10-01 PPPプロジェクト 3.0
1001 P002 2016-10-01 SMILEプロジェクト 2.0
1001 P080 2016-10-01 部内会議 1.0
1001 P099 2016-10-01 事務手続き 2.0

上記のデータは、社員番号、プロジェクト番号、日にちの組み合わせで、レコードが一意に識別できることは分かりますか? このとき、社員番号、プロジェクト番号、日にちで識別できる投入時間は完全関数従属しているといいます。プロジェクト名は、社員番号、プロジェクト番号、日にちの中の一部であるプロジェクト番号だけで識別できるので、完全関数従属しているとはいえません。

では、プロジェクト名は何といえばいいのでしょう。

部分関数従属

答えは「社員番号、プロジェクト番号、日にちをキーにしている場合、プロジェクト名は部分関数従属している」です。部分関数従属とは、「属性Yが属性Xの一部に関数従属する。Xが属性A+B+Cで構成される場合、いずれかの構成要素および構成要素の組み合わせ(A、B、C、AB、AC、BC)に関数従属するYは、Xに部分関数従属している」というのです。

推移関数従属

推移関数従属の「推移」的というのは、「間接」的と解釈すればいいので、「直接」的ではない関数従属があると考えればいいです。

例2:社員表
社員番号 社員氏名 入社日 部門番号 部門名
1001 鈴木一郎 2000-04-01 20 開発部
1001 高橋さくら 2000-04-01 30 経理部
1001 山田太郎 2000-04-01 10 営業部

上記の表では、社員番号が分かれば、その人の所属する部門番号が分かります。つまり、「社員番号が分かれば、部門番号が明らかになる」ので、「直接」的な関数従属がありますね(もちろん、社員番号が分かれば社員氏名も分かります)。

では、部門名はというと、「社員番号」が分かれば「部門番号」が明確になり、「部門名」が分かります。つまり、社員番号が分かれば、「間接」的に部門名も分かります。これが推移関数従属です。

これが理解できれば、次のような出題があっても戸惑うことはありませんよね。

問1

次の中から正しい説明をすべて選択しなさい

  • a. 社員表において、入社日は完全関数従属している
  • b. 勤務明細表において、プロジェクト名は部分関数従属している
  • c. 勤務明細表において、プロジェクト名は推移関数従属している
  • d. 社員表において社員氏名は推移関数従属している

もし、こういう出題があったら、「いきなり社員表って言われても、主キーは何なのよ?」とか、「社員表は社員番号が主キーだろうと想像がつくけど、勤務明細表は表名から主キーを想像するだなんて無理!」と文句を言いたくなるかもしれません。想像できるようになるには経験が必要ですが、情報処理技術者試験の模擬問題などを見てみるのもいいかもしれません。

学習の教材や試験の例として用いられる表は、「社員」「注文」「注文明細」「勤怠管理」などパターンがあるので、1列で主キーを表すタイプの表、複数列の組み合わせで主キーを構成する表のタイプを見慣れていれば、「勤務明細? 明細って言っているから「いつだれが何を……」のパターンでしょ。だから、複数列を組み合わせた主キーなんでしょうね」くらいの想像はつくようになります。

そうすれば、「勤務明細表の主キーは、勤務日、社員番号、プロジェクト番号ってところかしら。プロジェクト名はキーの一部に従属しているから、選択肢bの『部分従属している』は正解ね」というふうに、導くことができるようになります(選択肢cは不正解)。

社員表は、例2を想像すればいいでしょう。社員番号が分かれば入社日も社員氏名も明らかになるわけですから、入社日も社員氏名も完全関数従属していますよね。したがって、選択肢aは正解、選択肢dは不正解です。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • 林 優子(ハヤシ ユウコ)

    日本オラクル株式会社の教育ビジネスのスタートアップを全面的に支援し、バージョン5の頃からOracleに携わるベテラン講師として知る人も多い。Oracle認定講師を表彰するExcellent Instructorを連続受賞。1ランク上のITスペシャリスト育成を目標に、データベース分野にとどまらず「プレゼンテーション」、「ロジカルシンキング」などのトレーニングも手がけている。著書に『オラクルマスター教科書』シリーズ(翔泳社)、『プロとしてのデータモデリング入門』(SBクリエイティブ)など。その他、雑誌執筆、著書・メディア出演も多数。

バックナンバー

連載:めざせオラクルマスターホルダー! Oracle DB 12c SQL基礎 弱点克服スクール

もっと読む

この記事もオススメ

All contents copyright © 2015-2017 Shoeisha Co., Ltd. All rights reserved. ver.1.0