HOME»基本情報技術者試験掲示板»平成31年春期 午前問29(SQLとRDB)について
投稿する

平成31年春期 午前問29(SQLとRDB)について [5874]

 わんわんさん(No.1) 
▼平成31年春期 午前問29
https://www.fe-siken.com/kakomon/31_haru/q29.html
設問のSQLを実行した結果、2つのテーブルが結合されていますが、
「学生テーブルの住所」と「学部テーブルの住所」とがあり、
列名(属性)として、重複しているように思えるのですが、
これは関係データベースとして問題ないのでしょうか?
第1正規化では、列名(属性)の重複をなくすことなので、気になりました。
よろしくお願いいたします。
2025.04.22 17:56
電タックさん(No.2) 
FE ブロンズマイスター
学生表の住所は学生が住んでいる住所
学部表の住所は学部の建物がある住所
だと思います。

外部キーなどで参照したときに同じ列名を使うことはよくありますから別々の表に全くの同じ列名を作ることは何の問題もありません。
※逆に1つの表に同じカラム名はやったことがないですが作れない気がします。

運用上問題がありそうではありますがこの2つの表は一応第2正規形になっていると思います。
2025.04.22 20:44
GinSanaさん(No.3) 
FE シルバーマイスター
>列名(属性)として、重複しているように思えるのですが、
>これは関係データベースとして問題ないのでしょうか?

問題ありません。・・・で終わらせるとアレなので、もう少し解説します
where句でテーブルを結合していますが、これは内部結合です
結合した段階でのレコードには2つの住所列があります。この住所列をセレクトでどちらの列かを明示しない場合には問題になります。DBがどっちのを使えばいいのかがわからないからです。でも、使ってないので問題ないのです。

>第1正規化では、列名(属性)の重複をなくすことなので、気になりました。
それは、繰り返し項目を排除すること
ですね
たとえば、医者にいって湿布と痛み止めをもらったとして、医者がどの患者に何を出したか?のテーブルがあったとして、患者の番号と薬、とか入れた際に、繰り返し項目として痛み止め,湿布とかカンマとか改行とかで区切って入れるやつがいます。1セル1内容をエクセルでイメージすればわかると思いますが、第1正規形というのはそういうのをまずやめい、というところから始まっているのです。
2025.04.22 21:23
jjon-comさん(No.4) 
FE プラチナマイスター
基本情報 平成31年 春期 午前 問29
https://www.fe-siken.com/kakomon/31_haru/q29.html

あるデータベース製品は
SELECT * FROM 学生, 学部 WHERE 所属 = 学部名;
を実行すると
+――――+――+ ――――+―――+ ――――+
|氏名  |所属|学生_住所|学部名|学部_住所|
+――――+――+ ――――+―――+ ――――+
|情報太郎|工 |渋谷   |工  |新宿   |
|午前桜子|経済|新宿   |経済 |渋谷   |
|高度次郎|人文|渋谷   |人文 |渋谷   |
|応用花子|理 |新宿   |理  |新宿   |
+――――+――+ ――――+―――+ ――――+
のように、列名の重複を回避するための新たな列名 "学生_住所" や "学部_住所" を生成する仕様になっていました。

また別のデータベース製品は
SELECT * FROM 学生, 学部 WHERE 所属 = 学部名;
を実行すると
+――――+――+――+―――+――+
|氏名  |所属|住所|学部名|住所|
+――――+――+――+―――+――+
|情報太郎|工 |渋谷|工  |新宿|
|午前桜子|経済|新宿|経済 |渋谷|
|高度次郎|人文|渋谷|人文 |渋谷|
|応用花子|理 |新宿|理  |新宿|
+――――+――+――+―――+――+
という結果を出力しました。(このサイトの解説に登場する図はこの形式ですね)
SELECTの出力結果は単なる文字列なので、表示文字列としては "住所"という文字が複数出力されても問題ないということなのでしょうが、
この出力結果を CREATE TABLE や CREATE VIEW に送り込み、出力結果から新たな表を作る場合は、同名の列が複数登場するのでエラーとなります。
その場合は、
SELECT 学生.住所 AS 住所その1, 学部.住所 AS 住所その2
FROM 学生, 学部 WHERE 所属 = 学部名;
のように、重複しない列名を AS を用いて明示的に与えることになります。
2025.04.22 22:16
 わんわんさん(No.5) 
とても詳しく恐縮です💦ありがとうございます🙇‍♂️
回答いただいた内容に悩んでました。
「解説の表は、2つの表を結合した1つの表だし…内部結合って何?」と…
もしかして、解説のガッチャンコした結合された1つの表は、
SQLの処理途中の表であって、実表ではないということでしょうか!?
だから一見「住所」の同名の列があっても、
実際は「学生テーブルの住所」と「学部テーブルの住所」になってるということでしょうか?
> jjon-comさんのDB製品の違いがとても興味深かったです。
私の疑問は正しくこのことで
「学生_住所」「学部_住所」と表示されていれば疑問に思いませんでした。
スッキリできたように思います。
ご丁寧にありがとうございました!
2025.04.22 23:27
GinSanaさん(No.6) 
FE シルバーマイスター
>もしかして、解説のガッチャンコした結合された1つの表は、
>SQLの処理途中の表であって、実表ではないということでしょうか!?

はい、そうなります。DBの内部では、
学生.氏名、学生.所属、学生.住所、学部.学部名、学部.住所
.は「の」と読み替えてください

というくっつけただけのレコードが作られています。それを再現したのが解説の図です
実際は、レコードのアドレスがある感じだけど、考え方が難しくなるので聞かなかったことにしてください。
基本情報だとあっさりしないと難しく感じる方が多いのかこういう図になっています まあ、そのうちわかります
2025.04.23 21:35
 わんわんさん(No.7) 
> GinSana さん

ありがとうございます。
> レコードのアドレスがある感じ
なるほど、列名表記は同じでもDBはアドレスで認識しているから問題ないということですね。
一方で、ユーザーから見た内部結合の表は列名表記が同じなので困惑しますね💦
とても分かりやすかったです。ありがとうございました🙇‍♂️
2025.04.23 23:03
返信投稿用フォームスパム防止のためにスレッド作成日から40日経過したスレッドへの投稿はできません。
© 2010- 基本情報技術者試験ドットコム All Rights Reserved.

Pagetop