リレーショナルデータベースの勉強をしていて、壁にぶつかりました。
“Closure” of a set of attributeって…?
Closure =「閉包」
Closure of a set of attribute =「属性の集合の閉鎖・閉包・クロージャ」
「閉包」って何…?”Closure”って、一般的・概念的な単語すぎて具体的にわからない。
A+とかA→Bってどういう意味?
「閉包テーブル」と「Closure of a set of attribute」はまた違うのかな…?
疑問を1つ1つ解消し、解説していきます。
以下のサイトがとても参考になりました。
Closure of a set of attribute(属性の集合のクロージャ)とは
・リレーショナルデータベースについてのお話
・データがあるとき、項目A、B、Cの関係性についてのお話
・データベースの正規化に欠かせない視点
・「属性集合のクロージャ」はデータの関係性のこと
・試験では「関数従属性の集合がこんな感じな時、この属性集合の閉包は?」と聞かれる
属性集合のクロージャ
属性集合Xの閉包は、Xから関数的に決定できる属性の集合
Xのクロージャとは、Xの値が同じである2つのレコードがX+の値も同じであるようなすべての属性の集合のことである。
わかりやすく解説しましょう。リレーショナルデータベースでTEST_TABLEというテーブルを用意します。そしてそのテーブルにA,B,C,D,Eという5つのカラムを用意します。
「Aのクロージャ(閉包)」とは、カラムA(=X)の値が同じである2つのレコードがカラムB(= X+)の値も同じであるような全ての属性の集合のことである。
もっとシンプルに言い換えると、カラムAの値によってカラムBの値が決まるとき、カラムBは「Aのクロージャ(閉包)」です。正確に述べると、カラムA自体も「Aのクロージャ(閉包)」に含まれるので、「Aのクロージャ(閉包)」=カラムA、Bとなります。
「カラムAの値が決まればカラムBの値が決まる」を、“A→B”と表します。
「カラムAの閉包」をA+ と表します。つまり、”A→B”の関係性が判明している今、“A+ = A,B”(カラムAの閉包はカラムA、B)と表すことができます。
「カラムAの閉包」とは、「カラムAの値が決まったら付随して決まる項目」のことです。
試験問題の出題方法
上の段落にて、Aの閉包(=A+)を明らかにし、A+ ={A,B}であると判明しました。このように「カラムXの値がそのテーブルのどの項目の値を決めるか?」を明らかにしなさい、と言う出題が「Aの閉包を求めよ(= What is the closure of a set of attribute A? | What is A+?)」です。
回答の際の注意点は、「カラムAの閉包」には「カラムA自身」も含まれる点です。
クロージャの問題には、問題の対象であるデータ集合Xと、答えを出すために使う機能従属性の関係が与えられる。A→B, B→C,D, D→Eです。
具体例
Course Editions というテーブルがあるとします。このテーブルには、ある大学で教えられているコースに関する情報が含まれています。
毎年、各コースは異なる教師が教えることがあります。各教師の生年月日をデータとして持っているのでコースの開催年と生年月日の情報があれば、そのコースが教えられたときの先生の年齢がわかります。
(注意:データベースとしては悪い設計です。閉包の概念を説明するために使用しています。)
Course Editionテーブル
COURSE | YEAR | TEACHER | DATE_OF_BIRTH | AGE |
データベース | 2019 | A先生 | 1974-10-12 | 45 |
数学 | 2019 | B先生 | 1985-05-17 | 34 |
データベース | 2020 | C先生 | 1990-06-09 | 30 |
このテーブルの機能依存関係
コース, 年度 -> 教師
コースと年が与えられれば、その年にコースを担当した教師を決定することができます。
教師 -> 生年月日
教師が与えられた場合、その教師の生年月日を決定することができる。
年、生年月日 -> 年齢
年と生年月日が与えられれば、そのコースが教えられたときの教師の年齢を決定することができます。
属性のクロージャ(閉包)
集合{year}のクロージャ(= {year}+と表示)
YEARの値が分かった時、確実にYEARはわかります(そりゃそうですよね!)。つまり、yearは{year}+の要素になります。
他はどうでしょう。教師(TEACHER)は、年とコース名がわからないと特定できないので{year}+には当たりません。そのほかの値も、YEARだけから特定できる項目はないようです。
つまり、{year}+はyearのみ。{year}+ = {year}となります。
集合{year, teacher}のクロージャ(= {year, teacher}+と表示)
次にyearとteacherのセットの閉包を考えます。まず、{year}+と同じように、{year, teacher}自体が{year, teacher}+に入ります。
yearの値は横に置き、teacherがわかればteacher -> date_of_birth。先生の名前が分かれば生年月日もわかります。したがって、date_of_birthも{year, teacher}+に含まれます。今の段階で、{year, teacher}+ = {year、teacher、date_of_birth}ですね。
また、yearとdate_of_birthからageがわかりますね。ここで、{year, teacher}+ = {year, teacher, date_of_birth, age}。
次に、yearとteacherだけだと、courseの特定はできませんね。以上より、網羅が完了しました。
{year, teacher}+ = {year, teacher, date_of_birth, age}です。
ツボは言葉と表記の意味を理解すること
いかがでしょうか、理解は深まりましたか?
筆者の意見としては、言っていることは当たり前なんだけど、その呼び方(名称)や表記方法がちょっと分かりにくいなぁというところです。
一度理解してしまえばもう迷うことはないでしょう。悩みの迷路に入ることなく、この記事で皆さんが最短ルートで理解できたらいいなぁと思っています。
CS2203を受講中の方向け!トピック完全網羅するならこちら!
コメント