データベースのミニテスト(全35問)
データベースの用語を、定義ではなく「場面」から問う35問。主キーの種類、参照整合性、正規化の副作用、ロックの粒度、障害の戻し方、ビューが中身を持たないこと、ビットマップ索引が更新に弱い理由、行を絞って見せるときのビューとGRANTの組合せ、倉庫と切り出しと掘り出しの関係、次数と基数、別名が使える句と使えない句を集めています。
この単元は、用語どうしの境界がはっきりしているぶん、取り違えたまま覚えていても気づきにくいところです。
どの問題も、用語の意味をそのまま聞くのではなく、場面を出して「どれにあたるか」を選ぶ形にしました。用語ページのミニクイズとは角度を変えてあるので、あちらを解いたことがあっても、そのまま答えにはなりません。
間違えた問題は、その場で解説が出ます。それでも納得できなければ、問題の下に出る用語ページへのリンクから読み直してください。
問1
銀行の振込処理で、出金する側の更新は成功したが、入金する側の更新が失敗した。そこで出金もなかったことにして、処理を始める前の状態に戻した。この動きが守っている性質はどれか。
正解は 4番:原子性(Atomicity)
ぜんぶやるか、まったくやらないかのどちらかにする性質です。出金だけを残してしまうと、どこにも存在しないお金が消えたことになります。
ほかの選択肢は
一貫性は処理の前後でデータの決まりが破られないこと、独立性は同時に動かしても1つずつ順に動かしたのと同じ結果になること、耐久性は確定した結果が障害でも失われないことです。4つとも「トランザクションが守る性質」なので、事例から「何を守ろうとしているのか」を逆算して選びます。
問2
データベースを置いたディスクが壊れ、バックアップから復旧することになった。バックアップを取ったあとにコミットされていた更新を取り戻すために行うこととして、適切なものはどれか。
正解は 2番:ログに記録された更新内容を、バックアップに再適用して進める
コミット済みということは、利用者に「確定しました」と返事をしてしまったということなので、その結果は残さなければなりません。そのためバックアップに記録を再適用して前へ進めます。これをロールフォワードと呼びます。
ほかの選択肢は
開始前まで戻すのはロールバックで、こちらはコミット前に落ちた処理に使います。判断の基準は「コミット済みかどうか」の一点です。続きから再開するという選択肢はありません。トランザクションは「ぜんぶか、ぜんぶ無しか」なので、中途半端に途中から進める状態を作らないためです。壊れたあとにバックアップは取れません。
問3
受注明細表は、1つの受注番号の中に明細行が何行も入る。そのため受注番号だけでは行を1つに特定できず、受注番号と明細行番号の2列をあわせて主キーにした。このような主キーの呼び方はどれか。
正解は 2番:複合キー
1つの列だけでは行が決まらないとき、複数の列を組み合わせて主キーにします。
ほかの選択肢は
候補キーは、行を一意に決められる列または列の組のことで、その中から設計者が1つ選んだものが主キーです。選ばれなかったほうを代替キーと呼びます。サロゲートキーは、業務で使う番号の付け方が変わっても困らないよう、意味を持たない連番を新しく用意して主キーにしたものです。どれも主キーのまわりに出てくる言葉なので、それぞれがどの場面で登場するかで区別します。
問4
注文表の商品番号列が、商品表の主キーを参照する外部キーとして定義されている。ある商品への注文がまだ残っている状態で、その商品を商品表から削除しようとした。既定の動きとして適切なものはどれか。
正解は 1番:参照している注文が残っているため、削除できない
削除を許してしまうと、注文の側に「どの商品か分からない番号」が残ります。それを起こさないための仕組みなので、既定では削除させません。
ほかの選択肢は
連鎖して消す動きと、空欄にする動きも設計のときに選べますが、どちらも選んだ場合の動きであって既定ではありません。指した先に無い番号がそのまま残る動きだけは、外部キーの目的そのものを壊すので選べません。
問5
関係データベースの設計で正規化を進めた結果として、適切なものはどれか。
正解は 3番:更新時の矛盾は起きにくくなるが、取り出すときに表をつなぎ合わせる処理が増える
分けるほど同じデータを2か所に持たなくなるので、片方だけ直してしまう事故は減ります。そのかわり、まとまった情報を取り出すには表をつなぎ合わせることになります。参照が非常に多いシステムでは、速さを優先してあえて重複を残すことがあり、これを非正規化と呼びます。正規化は目的ではなく手段だ、という言い方をします。
ほかの選択肢は
なお正規化を進めると表の数は増え、1つの表に入る列は減ります。
問6
排他制御でロックをかける範囲を、表ぜんぶから行ごとに細かくした。このときに起こることとして、適切なものはどれか。
正解は 1番:同時に動ける処理は増えるが、ロックそのものの管理に手間がかかる
表ぜんぶをロックすると、関係のない行を触りたい人まで待たされます。行ごとにすれば待たされる人は減りますが、ロックの数そのものが増えるぶん、管理に手間がかかります。安全さと速さの折り合いをどこで付けるか、という判断です。
ほかの選択肢は
範囲を細かくしても、複数のロックを取り合って互いに待つ状態は起こりうるので、デッドロックが消えるわけではありません。
問7
排他制御の方式のうち、楽観ロックの説明として適切なものはどれか。
正解は 3番:ロックをかけずに進み、更新する直前に、読んだときから変わっていないかを確認する
「ぶつかることは滅多にない」という前提に立つ方式です。待ちが出ないかわりに、ぶつかったときはやり直しになります。
ほかの選択肢は
読んだ時点でロックをかけて他を待たせるのは悲観ロックで、前提が正反対です。同時に使う人が多いシステムでは、この2つのどちらを選ぶかが性能を左右します。
問8
複数の資源を使う処理が同時に走る環境で、デッドロックを起こさないための方法として、最も適切なものはどれか。
正解は 1番:資源にあらかじめ順番を決めておき、どの処理も同じ順番でしか確保しない
デッドロックは、待ち関係が輪になったときに起きます。全員が同じ順番でしか取らないと決めれば、輪ができようがありません。
ほかの選択肢は
検出して片方を取り消す方法は多くのデータベース製品が実際に行っていますが、これは起きてしまったあとの解消であって、起こさないための方法ではありません。確保できるまで待たせ続けるのは、輪になっているかぎり止まったままです。資源を手放させないのは「保持と待機」を強めるので、かえって起きやすくなります。
問9
分散データベースで2相コミットを使う目的として、最も適切なものはどれか。
正解は 2番:複数のデータベースにまたがる更新で、一部だけが確定した状態を作らないため
1台のデータベースの中だけなら、コミットとロールバックで「ぜんぶか、ぜんぶ無しか」を作れます。ところが複数にまたがると、それぞれが勝手に確定してしまい、片方だけ確定した状態が起こりえます。それを防ぐために、まず全員に確定できるかを聞き、全員が「できます」と答えたときにだけ確定を指示します。
ほかの選択肢は
1台が壊れても使えるようにするのは複製の話、重複を取り除くのは正規化の話で、どちらも2相コミットの目的ではありません。
問10
表に索引(インデックス)を作ったにもかかわらず、検索が速くなりにくい場合として、最も適切なものはどれか。
正解は 3番:「有効・無効」のように、値の種類が2つしかない列を条件にしたとき
索引は、探す範囲を一気に狭められるときに効きます。値が2種類しかない列だと、索引をたどっても結果が表の半分を占めてしまい、全部を先頭から読むのと大差がなくなります。データベース側の判断で索引が使われないこともあります。
ほかの選択肢は
残りの3つはいずれも、条件に合う行がごくわずかになる検索で、索引がいちばん効く形です。
問11
トランザクションのACID特性のうち、「いったん確定した更新は、その後に障害が起きても失われない」ことを指すものはどれか。
正解は 1番:耐久性(Durability)
耐久性は、コミットして確定した結果が残り続けることを指します。確定した直後に電源が落ちても、更新はログなどから復元され、無かったことにはなりません。確定前の処理が消えるのは当然なので、この性質が効いてくるのは確定したあとの話です。
ほかの選択肢は
原子性は「全部やるか、どちらもやらないか」で、途中までの状態を残さないことです。一貫性は、処理の前後で決まりが破られないこと。独立性は、同時に実行しても1つずつ順番に実行したときと同じ結果になることです。4つは名前の頭文字をつないでACIDと呼びます。
問12
データベースの索引(インデックス)が検索を速くする仕組みとして、最も適切なものはどれか。
正解は 1番:値を順序よく並べて枝分かれさせた構造をたどり、目的の値まで少ない回数で到達する
索引にはB木という構造がよく使われます。値を順序よく並べて枝分かれさせておくので、たどるたびに探す範囲が大きく絞られ、少ない回数で目的の値に届きます。全部を先頭から調べる全表走査と比べて、調べる回数が桁違いに減ります。
ほかの選択肢は
先頭から順に調べるのは、索引を使わない全表走査そのものです。結果を保存して使い回すのはキャッシュの考え方で、索引とは別の仕組みです。データを圧縮しているわけでもなく、索引はむしろ記憶領域を追加で使います。
問13
データベースでデッドロックが実際に起きたとき、多くの製品が行う対処として最も適切なものはどれか。
正解は 4番:どちらか一方のトランザクションを強制的に取り消して、もう一方を進ませる
デッドロックを検出すると、どちらか一方を選んで強制的に取り消し(ロールバック)ます。取り消された側はやり直しになりますが、両方が永久に止まり続けるよりはましだ、という判断です。犠牲になるほうをデッドロック・ビクティムと呼びます。
ほかの選択肢は
両方を取り消す必要はありません。一方を諦めさせれば、残ったほうは資源を確保できて先へ進めます。先に確保したほうを必ず取り消すという決まりもありません。待たせたままにすると、どちらも永久に終わらない状態が続きます。
問14
外部キーに設定された列が持つ性質として、最も適切なものはどれか。
正解は 2番:同じ値が重複してよく、空欄を許すこともある
外部キーは、ほかの表の主キーを参照する列です。同じ商品への注文が何件あってもよいので、値は重複して構いません。「まだ決まっていない」状態を表すために空欄を許すこともあります。参照先に存在する値であること、というのが外部キーに課される制約です。
ほかの選択肢は
重複を許さず空欄も許されないのは主キーの条件で、外部キーとはまったく逆です。ここが取り違えの中心になります。外部キーは主キーの相棒ではありますが、求められる性質は別だと押さえてください。
問15
参照が非常に多いシステムで、速さを優先してあえて重複を残すことがある。このような設計を何と呼ぶか。
正解は 4番:非正規化
正規化を進めるほど重複は消えますが、データを取り出すときに表をつなぎ合わせる手間が増えます。参照が非常に多いシステムでは、その手間が無視できなくなるため、速さを優先してあえて重複を残すことがあります。これを非正規化と呼びます。正規化は目的ではなく手段だ、ということです。
ほかの選択肢は
第1正規化は、繰り返し部分を取り除いて表を整える最初の段階です。部分関数従属は、主キーの一部だけで値が決まってしまう状態で、第2正規形で取り除く対象を指します。参照整合性制約は、外部キーの参照先が存在することを保証する決まりです。
問16
会員番号のような業務上の番号ではなく、意味を持たない連番を新たに用意して主キーにすることがある。このキーの呼び方はどれか。
正解は 3番:サロゲートキー
業務で使う番号をそのまま主キーにすると、業務の都合で番号の付け方が変わったときに困ります。そこで、意味を持たないただの連番を用意して主キーにすることがあり、これをサロゲートキー(代理キー)と呼びます。外の都合に振り回されなくなるのが利点です。
ほかの選択肢は
外部キーは、ほかの表の主キーを参照する列です。候補キーは主キーになりうる列の組のことで、その中から1つを選んだものが主キーになります。スーパキーは行を一意に特定できる列の組の総称で、余分な列を含んでいても構いません。
問17
データベースの処理中にシステムが停止した。コミットされていなかったトランザクションに対して行う復旧処理はどれか。
正解は 3番:ロールバック(後退復帰)
判断の基準はコミット済みかどうかの一点です。確定していなかった処理は無かったことにしなければならないので、ログを使って開始前の状態まで戻します。これがロールバック、後退復帰です。途中まで更新された状態を残すと、原子性が崩れてしまいます。
ほかの選択肢は
ロールフォワードは、コミット済みだったのにディスクへ書き込まれていない更新を、バックアップとログから進めて取り戻す処理です。向きが逆になります。チェックポイントは復旧の起点を作る仕組み、デッドロックの検出は資源の奪い合いへの対処で、どちらも復旧の向きを決めるものではありません。
問18
2相コミットの弱点として知られる「ブロッキング」が起こる状況として、最も適切なものはどれか。
正解は 2番:参加者が「できます」と返事をした後で調整役と連絡が取れなくなり、確定も取消もできないまま資源を押さえ続ける
第1相で「できます」と返事をした参加者は、確定の指示を待つ状態に入ります。ここで調整役と連絡が取れなくなると、確定してよいのか取り消すべきなのかを自分では判断できません。資源を押さえたまま待ち続けることになり、その資源はほかの処理から使えなくなります。
ほかの選択肢は
「できません」の返事を受けて全体を取り消すのは、2相コミットが正しく働いている動きです。通信の混み合いは性能の話で、ブロッキングとは別です。参加者どうしが互いの資源を待ち合うのはデッドロックで、相手が調整役ではない点が違います。
問19
ビュー(導出表)を定義したあとで、元になった実表のデータが更新された。このビューを参照したときに見える内容はどうなるか。
正解は 4番:更新後の内容が見える
ビューの正体は、保存された行の集まりではなくSELECT文そのものです。参照されるたびに元の実表へ問い合わせが行われるので、元の表が変われば見える内容もその場で変わります。
ほかの選択肢は
定義した時点の中身が焼き付くわけではありません。作り直す必要もなく、食い違いも起きません。中身を実際に持っているのは実表のほうで、ビューは持たない、という違いが出発点になります。
問20
ビットマップ索引を、更新が頻繁に行われる列に付けた場合に起きることとして、適切なものはどれか。
正解は 4番:1行の値が変わるたびに関係する並びを書き換えるため、ほかの行の更新も待たされる
1本の並びは多くの行にまたがっています。1行の値が変わると、その行に対応するビットを立て直すために並びを書き換えることになり、書き換えている間は、同じ並びに含まれるほかの行の更新も待たされます。
ほかの選択肢は
並びの本数が増えるのは値の種類が多い列の話で、更新の多さとは別の理由です。索引が自動で無効になることはありません。更新が集中する業務システムでは、この待ちが詰まりの原因になるため、ビットマップ索引は更新のほとんどないデータウェアハウスで使われます。
問21
ある表のうち、特定の支店の行だけを利用者に参照させたい。GRANT文と組み合わせて使う方法として、最も適切なものはどれか。
正解は 2番:その支店の行だけを取り出すビューを定義し、そのビューに参照権限を与える
GRANT文で指定できるのは表やビューの単位で、「この表のこの行だけ」という与え方はできません。見せてよい行だけを取り出すビューを作り、そのビューにだけ権限を与えます。相手からは、ほかの支店の行があること自体が見えません。
ほかの選択肢は
もとの表に権限を与えてしまえば、依頼したところで技術的には全部見えます。主キーの付け替えやインデックスの作成は、速さや一意性のための仕組みで、見える範囲を絞るものではありません。ビューで形を作り、GRANTで渡す、という2段構えになります。
問22
データディクショナリ/ディレクトリを整備しておくことが、いちばん効いてくる場面はどれか。
正解は 1番:ある項目の仕様を変えるとき、どこに影響が出るかを調べる場面
ディレクトリの側が持っているのは、その項目がどこにあり、誰が使っているかという所在の情報です。項目の桁数や意味を変えるとき、影響の及ぶ範囲をここから洗い出せます。作った人がいなくなっても調べられる、というのがこの仕組みの値打ちです。
ほかの選択肢は
読み出しを速くするのは索引、更新前の状態へ戻すのはロールバック、同時の更新を待たせるのは排他制御の役目です。いずれもデータそのものを扱う仕組みで、データについての情報を持つデータディクショナリとは層が違います。
問23
データウェアハウス、データマート、データマイニングの関係として適切なものはどれか。
正解は 1番:全社のデータをためたものがデータウェアハウス、そこから部門向けに切り出したものがデータマート、ためたデータから規則を見つける手法がデータマイニング
業務システムのデータを、時間の流れに沿ってためておく倉庫がデータウェアハウスです。全社分はそのままでは大きく扱いにくいので、営業部向け、製造部向けというように必要な範囲だけ切り出した小さな倉庫を作ります。これがデータマートです。マイニングは掘り出すという意味で、ためたデータから人が気づいていなかった規則を見つける手法を指します。
ほかの選択肢は
大きいほうがウェアハウス、小さく切り出したほうがマートです。向きを逆に覚えると、選択肢で迷います。どちらも日々の業務で更新しながら使うデータベースとは別に用意するもので、業務のデータベースそのものではありません。
問24
関係データベースではなくNoSQLを選ぶ理由として、最も適切なものはどれか。
正解は 2番:表の形に収まらないデータを扱いたい、またはサーバを増やして規模を広げたい
NoSQLは、表の形にこだわらないデータベースをまとめた呼び方です。あらかじめ列を決めずに持てること、サーバを横に並べて分担させやすいことが共通の特徴で、形の決まっていないデータや、増え続けるデータを扱う場面で選ばれます。
ほかの選択肢は
まとめて取り消せること、同じデータを2か所に持たず矛盾を防ぐこと、SQLで集計することは、いずれも関係データベースが得意にしている点です。NoSQLは、この強みの一部をあきらめる代わりに、形の自由さと規模の広げやすさを取っています。どちらが優れているという話ではありません。
問25
関係データベースで、次数と基数が指すものの組合せとして適切なものはどれか。
正解は 3番:次数は列の数、基数は行の数
次数は属性の数、基数は組の数、というのが関係モデルでの定めです。属性が列、組が行にあたるので、次数が列の数、基数が行の数になります。字面からは逆に見えるため、毎回取り違えられます。
ほかの選択肢は
行と列を入れ替えたもの、表の数を混ぜたものが誤りとして並びます。属性と組という理論上の言い方を、列と行という実務上の言い方に置き換えられるかが問われています。
問26
SELECT文で付けた別名(AS)を、ORDER BYでは使えてWHEREでは使えない理由として、適切なものはどれか。
正解は 4番:処理される順番がFROM、WHERE、SELECT、ORDER BYであり、WHEREはSELECTより前に動くため
書く順番と処理される順番が違います。SELECTは先頭に書くのに、処理されるのは終わりのほうです。ORDER BYはSELECTのあとに動くので、そのときには別名が付いています。WHEREはSELECTより前に動くので、まだ別名が存在しません。
ほかの選択肢は
規格で特別扱いされているわけでも、扱える型の違いでもありません。別名は表に保存されるものでもなく、その問合せの中だけで使われます。順番を1本覚えれば、WHEREに集計関数を書けないことも同じところから説明できます。
問27
ストアドプロシージャを多用したときに起きることとして、適切なものはどれか。
正解は 1番:処理がデータベース側に集まり、別の製品へ移しにくくなる
書き方はデータベース製品ごとに違うので、処理をそこへ寄せるほど、別の製品へ乗り換えるときの書き直しが増えます。サーバ側の負荷が上がることと合わせて、使いすぎたときの代償になります。
ほかの選択肢は
やり取りの回数は、まとめて呼び出せるぶん減ります。複数のアプリケーションから同じものを呼べることは、むしろ利点のほうです。あらかじめ解析された状態で置いておくので、その都度解析し直すこともありません。
問28
E-R図で多対多の関連を関係データベースの表として作るときの扱いとして、最も適切なものはどれか。
正解は 3番:両方の主キーを持つ表を間に1つ置き、1対多が2つ並ぶ形にする
関係データベースでは多対多をそのまま表現できません。両方の主キーを持つ表を間に置くと、1対多の関連が2つ並ぶ形になります。この表には、受講日や成績のように「その組合せについての事実」も入ります。
ほかの選択肢は
相手の主キーを複数の列として並べる形は、相手の件数が増えるたびに列を足すことになり、正規化の考え方から外れます。2つを統合する形や、片方を削除する形では、管理したい事実が失われます。
問29
スーパータイプとサブタイプに分けた設計で、サブタイプの主キーの決め方として最も適切なものはどれか。
正解は 2番:スーパータイプの主キーと同じ列にし、スーパータイプへの外部キーも兼ねさせる
1件のデータは、スーパータイプに1行、該当するサブタイプに1行として入ります。両者を結び付けるため、サブタイプの主キーはスーパータイプの主キーと同じ列にし、同時にスーパータイプへの外部キーにもします。
ほかの選択肢は
無関係な連番を作ると、2つの行を結び付けられません。区分属性はどのサブタイプかを見分ける列で、同じ値が多数の行に入るため主キーになりません。主キーを置かないと、1行を1つに決められなくなります。
問30
「0001」のような先頭に0を含むコードを格納する列のデータ型として、最も適切なものはどれか。
正解は 1番:文字列型にする
整数型にすると「0001」は数の1として格納され、先頭の0が消えます。コードは計算の対象ではなく、桁数そのものに意味があるので、文字列型で持ちます。桁数が決まっているならCHAR、変わるならVARCHARを使います。
ほかの選択肢は
整数型と浮動小数点数型では先頭の0が保てません。浮動小数点数型は誤差が出るため、金額にも向きません。日付型は日付を扱う型で、コードを格納する型ではありません。
問31
DROP TABLEとDELETEの違いとして、最も適切なものはどれか。
正解は 2番:DROP TABLEは表の定義とデータの両方を削除し、DELETEは行だけを削除する
DROP TABLEは定義を扱う命令で、表そのものが無くなります。DELETEはデータを操作する命令で、条件に合う行を消すだけなので表は残ります。取り違えると、作り直しが必要な結果になります。
ほかの選択肢は
2つを入れ替えた選択肢が誤りです。どちらも行だけを消す、どちらも定義を消す、という組合せも成り立ちません。なお、行を全部消して表を残す命令にはTRUNCATE TABLEがあります。
問32
受注表と受注明細表のように、親の行が無ければ子の行が意味を持たない関係で選ぶ参照動作として、最も適切なものはどれか。
正解は 4番:ON DELETE CASCADE
受注明細は、その受注が無ければ記録として意味を持ちません。親の行が消えたときに子の行も消えるCASCADEが向きます。ただし孫まで連なっていると何段も消えるので、下に何が連なっているかを先に調べる必要があります。
ほかの選択肢は
RESTRICTは親の削除を拒否する指定で、受注と顧客のように記録を残したい関係に向きます。SET NULLは参照している列をNULLにする指定で、部署と社員のように親が無くなっても子が残る関係に向きます。SET DEFAULTは既定値に置き換える指定です。
問33
担当する講師が決まっていない講座も含めて、講座の一覧を取り出したい。使う結合はどれか。
正解は 3番:講座を左に置いた左外部結合
内部結合は両方にそろっている行だけを残すので、講師が未定の講座は消えます。講座を左に置いた左外部結合にすると、講座の行はすべて残り、相手が無い部分の講師名はNULLになります。件数が合わないときに、ここが原因であることが多くあります。
ほかの選択肢は
内部結合では未定の講座が落ちます。講座表だけから取り出すと講師名を並べられません。講師を左に置くと、担当する講座が無い講師が残る形になり、求めているものと向きが逆になります。
問34
相関副問合せの特徴として、最も適切なものはどれか。
正解は 3番:内側の問合せが外側の行の値を参照し、外側の行ごとに計算し直される
相関副問合せは、内側が外側の行の値を使って計算します。そのため外側の1行ごとに内側が実行され、行ごとに基準が変わる条件を書けます。その人の部署の平均より高いか、といった判定に使います。
ほかの選択肢は
最初に1回だけ実行されるのはふつうの副問合せです。表としてFROM句に置くのは導出表の形、結果を保存して繰り返し使うのはビューや一時表の考え方になります。
問35
値が10と20の行が2行、NULLの行が1行ある列に対してAVGを求めた。結果はいくつか。
正解は 4番:15
AVGはNULLの行を数に入れません。分子も分母もNULLを除くので、30を2で割って15になります。NULLを0として扱いたい場合は、COALESCEで置き換えてから計算する必要があります。
ほかの選択肢は
10になるのは30を3で割った場合で、NULLを0として数えたときの値です。30は合計そのものです。NULLが混ざっていてもAVGは値を返すので、求められないということはありません。
この結果の使い方
間違えた用語は復習リストに自動でたまります。 用語ページのミニクイズで正解し直すと、リストから消えます。 記録は自分のブラウザ内(localStorage)にのみ保存され、サーバーには送信していません。