2005年03月15日

[ テクニカルエンジニア(データベース)/H16 ]

H16午後I 問1 vol.2

H16午後I 問1 vol.2 vol.1

※H16午後I 問1を自分なりに理解していないと混乱する恐れがありますのでご注意ください。 m(_ _)m

設問3(1)
解答例は
 旅程番号→→顧客番号|{搭乗日,便名}
と,なっているが,

 旅程番号→→{顧客番号,搭乗日}|便名
と,した場合,絶対ダメという理由が浮かばない。

 表1の意味と制約で「同じ旅程番号の顧客は,同一日程で同一の便を利用する」としてあるだけで,「同じ旅程番号の顧客は同一日程で,同一の便を利用する」と点を打つ場所を変えれば後者でも良い気がする。。。(※公式解答例は前者である)

 「搭乗日」というのが,乗客が航空便に搭乗する日 なのか
 「搭乗日」というのが,航空便が乗客に搭乗される日 なのか
 (※明らかに前者の方が一般的な解釈である)

 多値従属性の解説では,顧客番号と{搭乗日,便名}の間に特別な関係がないことが重要であるとしているが,搭乗日は顧客番号と便名の間をつなぐ「特別な何か」のような気もする。

 もうちょっと考えてみるか。。。
 →考えた結果はコメントを参照してください。
 多値従属性についての詳しい説明が欲しい人は,コメントの9と10にあります。

Posted by g@kko at 2005/03/15 22:30 | 個別記事表示 | コメントを見る (11) |
この記事をLicWikiに埋め込む:
コメント
2 :g@kko:05/03/15 22:47:01 [RES]

補足
 公式解答例に納得がいかない。と,いう訳ではありませんので。念のため。


3 :前スレ973:05/03/16 06:48:41 [RES]

> 旅程番号→→{顧客番号,搭乗日}|便名
>と,した場合,絶対ダメという理由
設問中に「同一の旅程では同じ便を2度以上使わない」というルールがないから、というのはどうですか?
現実には、ほとんど考えられませんが。

>「搭乗日」というのが,乗客が航空便に搭乗する日 なのか
>「搭乗日」というのが,航空便が乗客に搭乗される日 なのか
> (※明らかに前者の方が一般的な解釈である)
公式解答例は、例というぐらいだから常識的な解釈をとっているのでしょう。


4 :g@kko:05/03/16 07:30:24 [RES]

>>3 :前スレ973 さん。
 コメントありがとうございます。

 理由の整理ができました。
 航空便(便名,運航日,航空会社名,出発地,到着地,出発時刻,到着時刻)
 利用便(旅程番号,顧客番号,搭乗日,便名

 where 航空便.便名 = 利用便.便名 and 運航日 = 搭乗日
 で,表2「旅程の例」の出発時刻と到着時刻を求めるから。

 「運航日 = 搭乗日」というのがミソなんですね。

 関係「利用便」だけを見て,数学的な見解に入りすぎると,ビジネスロジックを見失うようで。気を付けないと。。。

>「同一の旅程では同じ便を2度以上使わない」
 同じ便名を2度使うためには,一般的に
 同一航空会社の同一出発地,同一到着地の航空便でなければなりません。
 (例:ANA243 羽田→福岡に2度以上乗る)
 そんな旅行はないっすなww


5 :前スレ973:05/03/16 18:39:44 [RES]

>>4
>「運航日 = 搭乗日」というのがミソなんですね。
むう、直感的に搭乗日と便名を分けてはいけないとは思ってたんですけど、
それってg@kkoさんが書いてることと同じことなのかな?
え~、つまり、日付を除いてしまうと出発時刻・到着時刻が特定できないからって考えてたんだけど・・・・。


6 :g@kko:05/03/16 20:46:46 [RES]

>>5 :前スレ973 さん
 運航日 と 搭乗日 の関係について適切な表現の単語が思い出せない。。。会社のデスクに置いている本に書いてあった気がするので,明日,本を確認します。

>日付を除いてしまうと出発時刻・到着時刻が特定できない
 顧客旅程(旅程番号顧客番号搭乗日
 旅程利用便(旅程番号便名

とした場合,もとの関係を復元するためには,
旅程番号で結合するだけでは,余計なタプルが出てきて,元の関係に戻せません。これは前スレ973さんの「特定できない」というのと同意です。
が,これにさらに
 航空便(便名運航日,・・・)

を,{便名,搭乗日}={便名,運航日}で結合すると,元の関係に戻ります。
※問題のインスタンスに限れば戻りますが他の(便名,運航日)の組合せがあると戻りません。

 つまり,関係「利用便」において,搭乗日は航空便の運航日を特定する役割を担っているということです。(顧客が搭乗する日ではなく)
 この「役割を担っている」ということの表現が何て言ったかな。。。適切な表現が出てこない。。。


7 :前スレ973:05/03/17 18:36:15 [RES]

すいません、>>3>>5は撤回します。
問題を読み返してみました。
利用便(旅程番号, 顧客番号, 搭乗日, 便名)に、旅程番号 →→ 顧客番号 | {搭乗日, 便名}が成り立つということは、
利用便 = 旅程番号 × 顧客番号 × {搭乗日, 便名} が成り立つということです(表現は正確ではありません)。
事実、表3のタプル例では、成立しています。
で、利用便 = 旅程番号 × {顧客番号, 搭乗日} × 便名は、
表3を見た限り、成立してなさそうです。

やはり、
旅程番号→→{顧客番号,搭乗日}|便名
は成り立たないのでは?


8 :g@kko:05/03/17 21:41:10 [RES]

>>6
適切な表現:ロール名でした。
※適切な表現かどうかは分かりませんが(汗;

運航日が「航空便が運行する日」という1つの役割の他に
『旅程で搭乗する「航空便の運航日」』という役割を持っているということです。


9 :g@kko:05/03/17 22:29:53 [RES]

>>7 :前スレ973 さん

すいません。混乱させてますね。。。

 顧客旅程(旅程番号顧客番号
 旅程利用便(旅程番号便名搭乗日
と,分解した場合,旅程番号で結合すると元の関係「利用便」に戻せます。
もちろん,出発地や出発時間も特定できます。

表2のSQLはこうでしょうか。。。
SELECT 搭乗日, 出発地, 到着地, 出発時刻, 到着時刻, 航空便.便名
FROM 顧客旅程, 旅程利用便, 航空便
WHERE
  顧客番号 = 'A01' AND
  顧客旅程.旅程番号 = 'P1' AND
  顧客旅程.旅程番号 = 旅程利用便.旅程番号 AND
  旅程利用便.便名 = 航空便.便名 AND
  旅程利用便.搭乗日 = 航空便,運航日

旅程番号→→{顧客番号,搭乗日}|便名
成立しないと整理しています。


10 :g@kko:05/03/17 22:44:08 [RES]

>>9 の補足です。

 顧客旅程(旅程番号顧客番号搭乗日
 旅程利用便(旅程番号便名

と,分解した場合,

旅程番号で結合すると

元の利用便に無かった黄色いタプルが出てきます。

多値従属性において(デ技P63より)

 多値従属性X→→Y|Zは,関係R(X,Y,Z)において一定のパターン(x,y,z),(x,y’,z’)があるならば,パターン(x,y’,z),(x,y,z’)もRの組であると,形式的にとらえることができる。
を満たしていないため
つまり,黄色の組合せの旅程は(ビジネス的に)存在しないため,多値従属性は成立しません。


11 :前スレ973:05/03/18 07:05:46 [RES]

7で書いてあること、めちゃくちゃだな。

 多値従属性X→→Y|Zは,関係R(X,Y,Z)において一定のパターン(x,y,z),(x,y’,z’)があるならば,パターン(x,y’,z),(x,y,z’)もRの組であると,形式的にとらえることができる。

ってことを直積と絡めて理解したら楽かな?と思ったんだけど。


12 :g@kko:05/03/18 08:37:19 [RES]

>>12
もう一個補足です。

多値従属において,
もとの関係に戻ることが必要なのではなく,
結合によって現れる組合せが「存在」することが必要ということですね。