HOME»応用情報技術者試験掲示板»令和6年春 問6 データベース
投稿する
令和6年春 問6 データベース [5799]
HYYさん(No.1)
https://www.ap-siken.com/kakomon/06_haru/pm06.html
「会社番号ごとのスキーマに対象の表と同じ名前のビューを作成して照会できるようにすると、現在のシステムのSQL文への修正を少なくすることができる」
共有用スキーマの国民の祝日表のビューを作成することでSQL文への修正を少なくすることができる旨の記載がありますが、ビューへの理解がなく、どのように少なくできるか具体的なイメージができません。
ビューを作成することでSQL文への修正を少なくできるとはどういうことでしょうか?
「会社番号ごとのスキーマに対象の表と同じ名前のビューを作成して照会できるようにすると、現在のシステムのSQL文への修正を少なくすることができる」
共有用スキーマの国民の祝日表のビューを作成することでSQL文への修正を少なくすることができる旨の記載がありますが、ビューへの理解がなく、どのように少なくできるか具体的なイメージができません。
ビューを作成することでSQL文への修正を少なくできるとはどういうことでしょうか?
2025.04.17 21:51
おたんこさん(No.2)
ビューそのものが、「SQL文への修正を少なくすること」に
寄与するわけではなく、単一データベース・個別スキーマ方式が、
「SQL文への修正を少なくすること」に寄与すると考えるのが
よろしいのではないでしょうか。
寄与するわけではなく、単一データベース・個別スキーマ方式が、
「SQL文への修正を少なくすること」に寄与すると考えるのが
よろしいのではないでしょうか。
2025.04.18 08:13
GinSanaさん(No.3)
★AP プラチナマイスター
たとえば、なんかの社内システム(複数)があって、システムごとにその表を参照する際の条件が違うと、システムごとにwhere句書き換えたりとか余計な処理が発生して、その先で修正する際も漏れがないかとか余計な手間が発生するので、SELECTだけで済むようにスキーマ(ユーザ)ごとに「その表を参照する際の条件」を取り込んだビューを同名で作っておけば、それを参照するクエリは同一になるから楽だよね、という話です。
たとえば、
区分, ユーザID
※区分:システムAではA、システムBではBが入る
があったとして、これをシステムごとにやったら
where 区分 = :区分
でシステムごとにバインド変数の値を設定するところを書いて
という作業がありますが
ビューでシステムA用のスキーマにはwhere 区分 = 'A'、システムB用のスキーマにはwhere 区分 = 'B'としておけば
システムのクエリはWHERE句がいりませんので修正が局所化します
どこを直そうが楽だろと思うかもしれませんが、システムのクエリはビルド、デプロイが基本的に必要です
その作業をやるよりか、DBをいじるほうが楽なのです(まあ、場合によるかもしれませんが、明らかに楽です)
たとえば、
区分, ユーザID
※区分:システムAではA、システムBではBが入る
があったとして、これをシステムごとにやったら
where 区分 = :区分
でシステムごとにバインド変数の値を設定するところを書いて
という作業がありますが
ビューでシステムA用のスキーマにはwhere 区分 = 'A'、システムB用のスキーマにはwhere 区分 = 'B'としておけば
システムのクエリはWHERE句がいりませんので修正が局所化します
どこを直そうが楽だろと思うかもしれませんが、システムのクエリはビルド、デプロイが基本的に必要です
その作業をやるよりか、DBをいじるほうが楽なのです(まあ、場合によるかもしれませんが、明らかに楽です)
2025.04.18 09:57
jjon-comさん(No.4)
★AP プラチナマイスター
応用情報 令和6年 春期 午後 問6
https://www.ap-siken.com/kakomon/06_haru/pm06.html
●1
企業C001にとっては
「FROM 国民の祝日」と指定すればそれは「C001社の 国民の祝日 表」だと確定しますし、
「FROM 会社記念日」と指定すればそれは「C001社の 会社記念日 表」だと確定します。
●2
表2の〔単一データベース・個別スキーマ方式〕
という状況の場合、図2のSQL文に登場する表名は次のように指定します。
ちなみに、どのデータベース製品にも「スキーマ名を省略したときのスキーマ名を設定する」という命令があります。
MySQLですと「USE スキーマ名」がそれです。
この場合、「USE C001」を実行した以降であれば、
しかし、「PUB.国民の祝日」の PUB. は省略できません。
●3
図4では次のビュー(仮想表)を作成しています。[ e ][ f ]の空欄を埋めたものがこれです。
参照できるような別名を与えたものと言えます。
もしかすると利用者は、「C001.国民の祝日」を
CREATE TABLEで作られた実表だと思っているかもしれないけれど、
実は CREATE VIEWで作られた仮想表であり、
「C001.国民の祝日」に対するアクセスはこれをスルーして「PUB.国民の祝日」実表に到達します。
●4
結論です。
上記●3のように、
「PUB.国民の祝日」と同名表・同名列なのにわざわざ「C001.国民の祝日」というビュー(仮想表)をもうけた理由は、
最初に「USE C001」を実行してしまえば、
このSQL文は●1とまったく同じであり、いっさい変更していません。
https://www.ap-siken.com/kakomon/06_haru/pm06.html
●1
現在は,契約している会社ごとに仮想サーバを作成して,その中にデータベースを個別に作成している。
という状況の場合、図2のSQL文に登場する表名は次のように指定します。FROM 国民の祝日
(略)
FROM 会社記念日
「国民の祝日」表も「会社記念日」表も会社ごとに複数存在するけれど、契約外の他社の仮想サーバにはアクセスできないので、(略)
FROM 会社記念日
企業C001にとっては
「FROM 国民の祝日」と指定すればそれは「C001社の 国民の祝日 表」だと確定しますし、
「FROM 会社記念日」と指定すればそれは「C001社の 会社記念日 表」だと確定します。
●2
表2の〔単一データベース・個別スキーマ方式〕
という状況の場合、図2のSQL文に登場する表名は次のように指定します。
FROM PUB.国民の祝日
(略)
FROM C001.会社記念日
2つの表の所属するスキーマが異なるので、スキーマ名を指定しなければならない。(略)
FROM C001.会社記念日
ちなみに、どのデータベース製品にも「スキーマ名を省略したときのスキーマ名を設定する」という命令があります。
MySQLですと「USE スキーマ名」がそれです。
この場合、「USE C001」を実行した以降であれば、
FROM PUB.国民の祝日
(略)
FROM 会社記念日
というSQL文になります。スキーマ名を省略した「会社記念日」は「C001.会社記念日」と確定できます。(略)
FROM 会社記念日
しかし、「PUB.国民の祝日」の PUB. は省略できません。
●3
図4では次のビュー(仮想表)を作成しています。[ e ][ f ]の空欄を埋めたものがこれです。
CREATE VIEW C001.国民の祝日(祝日, 祝日名)
AS SELECT 祝日, 祝日名 FROM PUB.国民の祝日
これは「PUB.国民の祝日」表に対して、同名表・同名列のまま「C001.国民の祝日」表としてAS SELECT 祝日, 祝日名 FROM PUB.国民の祝日
参照できるような別名を与えたものと言えます。
もしかすると利用者は、「C001.国民の祝日」を
CREATE TABLEで作られた実表だと思っているかもしれないけれど、
実は CREATE VIEWで作られた仮想表であり、
「C001.国民の祝日」に対するアクセスはこれをスルーして「PUB.国民の祝日」実表に到達します。
●4
結論です。
上記●3のように、
「PUB.国民の祝日」と同名表・同名列なのにわざわざ「C001.国民の祝日」というビュー(仮想表)をもうけた理由は、
最初に「USE C001」を実行してしまえば、
FROM 国民の祝日
(略)
FROM 会社記念日
というSQL文で「C001.国民の祝日」仮想表にも「C001.会社記念日」実表にもアクセスできるからです。(略)
FROM 会社記念日
このSQL文は●1とまったく同じであり、いっさい変更していません。
共有用のスキーマに作成した表は,会社ごとのスキーマに対象の表と同じ名前のビューを作成して照会できるようにすると,現在のシステムのSQL文への修正を少なくすることができる。(引用者による補足… 修正は「USE C001」の一行だけ)
2025.04.18 15:02
HYYさん(No.5)
おたんこ さん
GinSana さん
jjon-com さん
回答ありがとうございます
ビューを使わなかったときと使ったときの例が分かりやすく、理解することができました。
ありがとうございます。
GinSana さん
jjon-com さん
回答ありがとうございます
ビューを使わなかったときと使ったときの例が分かりやすく、理解することができました。
ありがとうございます。
2025.04.18 19:29