HOME»応用情報技術者試験掲示板»平成22年秋期午後問6 設問1
投稿する

[2540] 平成22年秋期午後問6 設問1

 SQL勉強中さん(No.1) 
設問1のdの請求書番号はなぜ複合キーになるのですか?

また、主キーと複合キーの見分け方のコツがあったらご教示お願いします。

https://www.ap-siken.com/kakomon/22_aki/pm06.html
2021.04.11 21:32
今回初試験_30代さん(No.2) 
【入金】と【入金消込】は1対多の関係です

仮に【入金消込】の主キーが入金番号だけの場合
その時点で1対多の関係に矛盾が発生してしまいます
※主キーには一意制約がある

そのため、別の項目も主キーとして扱う必要があり
その候補となるのが【請求書】の請求書番号になるわけです
2021.04.11 22:22
 SQL勉強中さん(No.3) 
ご回答ありがとうございます。

理解力がなくてすみません…

dの請求書番号が1対多の関係だから、外部キーになるのは分かっています。

この時の選択肢として、
請求書番号(外部キーのみ)
請求書番号(主キー+外部キーの複合キー)
の2通りがあるはずです。

なぜ、請求書番号(主キー+外部キーの複合キー)が正解になるのですか?

入金番号だけでは消込額は一意に決まらないのですか?
2021.04.13 19:56
ガンバさん(No.4) 
この投稿は投稿者により削除されました。(2021.04.14 16:51)
2021.04.14 16:51
updraftさん(No.5) 
結論としては、”入金は複数の請求に割り当てられることができる”ので複合キーとなるとお考えください。
請求額と入金額を比べたとき入金額が大きかったとき、つまりとある請求が払い終わってあまった入金額(お釣り)がでた場合、
残った入金額(お釣り)はどうなるでしょうか。
これは問題文にあるように次の請求に割り当てられることになります。
つまり一回の入金額を複数の請求で使い回すことになるので結果複合キーとなる要因になります。
数値を使った例で補足説明を行います。
----------入金-----------
入金番号:1
顧客番号:1
入金日:2021年4月14日
入金額:10000
消込額:0
----------入金----------
入金番号:2
顧客番号:1
入金日:2021年4月15日
入金額:10000
消込額:0
----------請求-----------
請求諸番号:1
顧客番号:1
請求日:2021年4月14日
請求額:2000
----------請求-----------
請求諸番号:2
顧客番号:1
請求日:2021年4月14日
請求額:10000
---------入金消込------------
入金番号:1
請求書番号:1
消込額:2000
請求書番号1を処理したとき、入金番号1の消込額が2000と更新されると思います。
つまり残り8000は次の請求に割り当てることができるということです。
---------入金消込------------
入金番号:1
請求書番号:2
消込額:8000
請求書番号2を処理したとき入金番号1の入金額(残った金額 8000)を使い切りました。
その場合は、次の入金番号2が割り当てられます。
---------入金消込------------
入金番号:2
請求書番号:2
消込額:2000
そのあと入金番号2の消込額が2000と更新されると思います。
---------------------
こう考えると、入金番号1のデータが複数生成されることになります。
これは整合性の観点からふさわしくないので、
入金番号と請求書番号の複合キーが正解となると思います。
2021.04.14 16:36
updraftさん(No.6) 
>また、主キーと複合キーの見分け方のコツがあったらご教示お願いします。
について回答を忘れていたので、追記します。

やはり一番のコツとしては、実際に値を当てはめることです。
先程、複合キーの説明を行ったのですが、その説明の例にあるような感じでやるとイメージがしやすいと思います。

あとは、やはり勘だと思います。
というのも、データベースの問題傾向はあまり変化がないと感じています。
SQL勉強中さんもよく似たテーブル構成の問題も見たことあると思います。

突拍子もないテーブル問題は、でないです。
なぜなら、問題として成り立たない場合が多いですし、テーブル構成としてもなりたっていないからです。
過去問や実際にテーブル設計して経験を培うと短時間で正解にたどり着けると思います。
2021.04.14 17:12
ANDYさん(No.7) 
まず、問題として図4で「pay.[ d ]←bill.請求書番号」となっている部分と
請求エンティティと入金消込エンティティが1対多である(関係がある)ことから
d=請求書番号と入れないといけないのがわかるかと思います。

ただし、この辺、毎回そうかというとたまに名前が変更されていたりするので、
少し要注意です。
(H29秋の図2の従業員コードのところとか)


では質問者さんのいう通り「請求書番号」が外部主キーなのか、
ただの属性名なのか、複合主キーなのかという話です。

入金エンティティと同じくように
入金消込エンティティで入金番号のみが主キーであると考えると
入金消込エンティティと入金エンティティは1対多の関係にならないです。
どちらも同じ属性のみが主キーであれば1対1の関係になってしまいます。
あとは1つのエンティティで1つの属性が主キーとなっているのに、
別のエンティティで同じ項目が主キーになるのは問題として不自然です。

そのため入金消込エンティティにおける[ d ]は
入金番号と複合主キーであることがわかります。

あと質問者さんの方で複合主キーの意味を取り違えているのではないかと思います。
複合主キーは「主キー+外部キー」ではなく、
「そのテーブルの属性の中で2つの属性を決めれば、ほかの属性がすべて決まる」が
複合主キーです。
つまりは単体では主キーにはならないが、2つを合わせることで主キーになるものが
名前のとおり「複合」主キーです。
外部キーは「隣のエンティティで主キーになっている属性」です。

SEさんがよくお世話になっているであろう
「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
なんかで複合主キーを調べるとよりわかりやすいです。
2021.04.14 18:29

返信投稿用フォーム

スパム防止のためにスレッド作成日から30日経過したスレッドへの書込みはできません。
© 2010-2024 応用情報技術者試験ドットコム All Rights Reserved.

Pagetop