投稿する

R3 問1 設問2の(1)と(2) [0780]

 awesamさん(No.1) 
設問2の(1)の答えに{加盟企業コード, 横断分析用商品コード}が含まれていて(2)の答えが、この候補キーで理由が横断分析用商品コードが加盟企業商品の登録をされた後に設定されるから(初めはNULL値であるから)ということなのですが、納得がいきません。

そもそも、候補キーはタプルを一意に識別できる属性の組みの極小のものであり、NULL値が入り得る属性が候補キーの一部になるのはおかしいと思っています。

なので、主キーに採用できない候補キーというよりも{加盟企業コード, 横断分析用商品コード}は候補キーにすらならないという考えが自然だと思っています。

この考え方はおかしいですかね?
2024.09.24 09:41
 awesamさん(No.2) 
> 候補キーに「値無し」(NULL値)を許容するかは諸説あるが、主キーにNULLは許容されないため、「主キーの候補である」とする立場では許容されないとなる。

> NULLを許容する候補キーというものを認めるかについては諸説ある。一部の人々は、主キーには認められないが候補キーには認められると、考えている。別の人々は、主キーには認められないし候補キーにも認められないと、考えている。主キーには認められないが候補キーには認められるという考えについては、候補キーのうちの任意に選ばれた一つが主キーであるとする定義とは矛盾する。

調べたところ、上記のような考えが見つかりました。
諸説あるということですが、候補キーの定義がタプルを一意に識別できる属性の組みの極小なのですからNULLが認められるとか意味がわかりません。

そして、諸説あるようなものであれば問題にすべきではないのではと思ってしまいます。。
2024.09.24 09:48
GinSanaさん(No.3) 
DB ゴールドマイスター
https://www.ap-siken.com/kakomon/22_aki/q29.html
で、
関係データベースの候補キーとなる列又は列の組に関する記述として,適切なものはどれか。
値を空値(null)にすることはできない。
が間違い扱いになっているということは、IPAは候補キーではNULLはOKな宗派だということのようです。
2024.09.24 10:52
GinSanaさん(No.4) 
DB ゴールドマイスター
個人的には、候補キーでnullを許容していてもいずれ主キー化で使えないんだからそんなものを挙げるなよ、というタイプですが、候補キーでnull許容はどうも主流派のようで、ははあ、そういうもんなのですね、と勉強になりました。
2024.09.24 10:55
みかんさん(No.5) 
DB ブロンズマイスター
> 主キーに採用できない候補キーというよりも…候補キーにすらならないという考えが自然だと思っています。
  候補キーをAAA,BBBと仮定します。
  BBBが初めからNULL値である場合、候補キーにすらならないので却下。
  BBBが初めからNULL値であったり値が入っていたりする場合、候補キーにすらならないので却下。
  では、BBBが初めからNULL値だけど遅かれ早かれ値が設定されるように設計されていたり値が入っていたりする場合は、どうなるかしら?
  ※先に謝っておきます、ごめんなさい。候補キーについて詳しくないので、答えは分かりません。NULLに発想を飛ばしてもう少し考えることも出来るかもしれませんね。
2024.09.24 21:10
 awesamさん(No.6) 
GinSanaさん

ありがとうございます。

https://www.ap-siken.com/kakomon/22_aki/q29.html

こちらの作成者の方は、この問題が矛盾していることに気づかないのでしょうかね。。
nullが許容されたカラムを含む候補キーで、どうやって行を唯一に識別できるのでしょうか。。

多数派というか、IPAがnull許容を広めてしまったとかですかね。
候補とは主キーの候補という意味だと思うので、一意に特定出来なくなるnull値が含まれるのは論理的におかしいと思ってしまいます。。

> ははあ、そういうもんなのですね、と勉強になりました。

まぁ、そうですね、無理矢理納得して先に進みますw
2024.09.24 21:49
 awesamさん(No.7) 
みかんさん

ありがとうございます。

>   では、BBBが初めからNULL値だけど遅かれ早かれ値が設定されるように設計されていたり値が入っていたりする場合は、どうなるかしら?

運用上、時系列的にnull値の時がある以上はその時点では一意に行を識別することはできないわけですから(null値の行が絶対に同時には一行しかできないという仕様なら別ですが、そんなの見たことありません)、それを候補キーを構成する属性にするのはおかしくないかなぁと思っている感じです。

GinSanaさんから、提供していただいた過去問も明らかに矛盾してますから。
2024.09.24 21:58
GinSanaさん(No.8) 
DB ゴールドマイスター
「オブジェクト指向と情報処理試験」
オブジェクト指向と情報処理試験 -2001年 春-]
ココが変だよ?  情報処理試験

というサイトで、この話の記述があったので、少し読んでみました。しかし同じことを考える人は何だかんだいるもんだなと半ば感心しました。
えせスピーカー 候補キーが空値を許すって言うのは SQL92 からみたいですね。というのも、SQL92ではUNIQUE の指定の時にかならずしも NOTNULL 指定がいらない、つまり一意に識別される属性にもNULLが許されるということになっています。このあたりは、MySqlなりPostgresなりの文献を参照して下さい。つまりこれは候補キーに空値が許されることだと思うのですが。
で、また"相当"の定義にもどることになる。
??? うーーん、"UNIQUE 指定時に NULL が許される"、という話しと、"候補キーにNULLが許される"ってのは別個の話しですよね。
UNIQUE 指定は、"その要素のもつ値が、テーブル中で唯一である"、ということを示すものであって、"その要素により、テーブル中の行を特定できる"、という意味ではないですから。
候補キーにとって、UNIQUE であることは必要条件ですが、十分条件ではありません。
ってことで、やっぱり "候補キーには空値は許されない"、と思います。
#候補キーの要素中、NULL値をとる行が唯一であれば、(数学的に空値っ て何を示す?、って話しもありますが)それはOKかもしれません :-)
??? (まぁ、上の話しはあくまでいちびった余談ですので、、、一応説明します)

候補キーはその定義から、とあるテーブルRにおいてある属性Kが候補キーであるとは、2つの異なる行s, r に対して、s[K] != r[K] であることが条件とされています。

従って、属性Kにおいてnull 値が唯一であれば、この条件は満たされることになります。

この場合、
単に候補キーでも null がOK、というわけでなく、同時にnull 値をとるのが唯一の行であることが保証されていなければならない。
そもそも null 値をさも"通常の値"のように扱ってよいのか、という数学的な問題がある。

個人的には、IPAのいう候補キーのNULL許容につき、「単に候補キーでも null がOK、というわけでなく、同時にnull 値をとるのが唯一の行であることが保証されていなければならない」であれば、constraintとしてのnot null制約はRDBMSの問題、としてまだ理解できます。
2024.09.26 14:11
GinSanaさん(No.9) 
DB ゴールドマイスター
一応増永のも見直してみましたが、「なぜ」nullが許容されるのか?に対する直接の疑問に触れていないので、どうしたもんかと思っていたら、
主キーと候補キーのNULL許容が異なる理由(teratail)
でなかなかアクロバティックな回答がありました。
データベースは三値論理で動いていますので、NULL = NULLはtrueにならず、結果不明とみなされます。

というわけで、UNIQUEに(決して同じ値だとは解釈されない)NULLを複数入れられても問題ありませんし、実際にそのように振る舞うRDBMSも存在します。
三値論理をわかっていても、言われないとなかなか気づけない理屈ですね。
2024.09.26 14:39
GinSanaさん(No.10) 
DB ゴールドマイスター
relational theory - Simple and Composite Candidate Key and Nulls - Database Administrators Stack Exchange
の回答の方がもう少し親切でした。恐らく、エドガー・F・コッドはこの考え方なんだろう、と思う回答です。
One of the differences between a candidate key and a primary key is that "candidate keys can contain nulls." I have been unable to find a more precise definition of what this means. One explanation I have seen is that in a CK with only one attribute, exactly one value can be NULL. Presumably this is because that NULL can uniquely identify a tuple/row. Is this correct?
候補キーと主キーの違いの 1 つは、「候補キーには NULL を含めることができる」ということです。これが何を意味するのか、より正確な定義を見つけることができませんでした。私が見た説明の 1 つは、属性が 1 つだけの CK では、正確に 1 つの値が NULL になる可能性があるというものです。おそらく、NULL はタプル/行を一意に識別できるためでしょう。これは正しいでしょうか?
How are we supposed to tell if we are about to create duplicates in a candidate key? Well, you have duplicates if the value you're trying to insert matches any value currently in the table. However, if what we are trying to insert is NULL you can only ever get the answer "unknown".

One way to address this is to define that candidate keys may not contain nullable columns. That's legitimate. Another is to extend the definition of duplicate to "new value equals existing value or new value is null and an existing value is null." This is also legitimate. Neither is right or wrong, they are just two differing definitions which have been given the same name.

(・・・)It depends on how worked up you want to get about 3-value logic or if you accept that a NULL can be treated as being the same thing as another NULL.
候補キーに重複を作成しようとしているかどうかをどうやって判断すればよいのでしょうか。挿入しようとしている値が現在テーブルにある値と一致する場合は、重複があります。ただし、挿入しようとしているのが NULL の場合は、「不明」という答えしか得られません。

これに対処する 1 つの方法は、候補キーに null 許容列を含めないように定義することです。これは妥当です。もう 1 つの方法は、重複の定義を「新しい値が既存の値と等しいか、新しい値が null で既存の値が null である」に拡張することです。これも妥当です。どちらも正しいとか間違っているとかいうわけではなく、同じ名前が付けられた 2 つの異なる定義にすぎません。
(・・・)3 値ロジックをどの程度まで理解したいか、または NULL を別の NULL と同じものとして扱うことができることを受け入れるかどうかによって異なります。

この理屈なら、NULL許容方向で納得がいきます。
2024.09.26 15:04
 awesamさん(No.11) 
GinSanaさん

ありがとうございます。

> データベースは三値論理で動いていますので、NULL = NULLはtrueにならず、結果不明とみなされます。
というわけで、UNIQUEに(決して同じ値だとは解釈されない)NULLを複数入れられても問題ありませんし、実際にそのように振る舞うRDBMSも存在します。

三値論理でNULLは値としては扱われず、どの条件にもtrueにならないことはもちろん把握しています。
ですが、決して同じ値だとは解釈されないというのと行を一意に識別できることは全く別の話だと思っています。
同じ値と解釈できないことで各行が別々だと判断できると言っても、それは特定の行を一意に識別できているとは言えないと思います。
ユニークキー制約でNULLが許されるのはあくまで各行が別物だという解釈をされるからであって、一意に識別できるからではないですよね?

例えば、学校の教室に10人の生徒が仮面を被った状態でいた場合、10人という人間がそれぞれ別々に存在することはわかりますが、その一人一人が誰なのかは識別することはできないですよね?(体型とかでは識別できない前提)
これが、私の中ではユニークキー制約にNULLは含めることができて、候補キーには含めてはいけないと考える理由になります。(候補キーの定義は、行を一意に識別できるという点だと思うので)
2024.09.27 10:57
 awesamさん(No.12) 
おそらく候補キーにNULLを含めていい派の方々としては、一意に識別という部分が別々であることがわかれば良いという考え方なのかなぁと思っています。
2024.09.27 11:08
返信投稿用フォーム
お名前
顔アイコン

本文(コミュニティガイドライン⇱を順守して適切な投稿を心がけましょう)
🔐投稿削除用のパスワード
投稿プレビュー
※SQL文は全角文字で記載してください。
※宣伝や迷惑行為を防止するため、当サイト、姉妹サイト、IPAサイト以外のURLを含む文章の投稿はできません。
投稿記事削除用フォーム
投稿No. パスワード 
© 2016-2024 データベーススペシャリストドットコム All Rights Reserved.

Pagetop