完全無料全講座・全機能が無料追加課金なし
PUT IT INTO PRACTICE

覚えたことを、
つなげてみよう。

5の授業から1問ずつ出題します。
これは基礎の確認です。試験の模擬問題ではありません。

CHECK YOUR UNDERSTANDING

データベース入門・5問チャレンジ

自作問題

問題の条件を読み、自分の答えを考えます。間違えても大丈夫。考え方を確かめてから、もう一度挑戦できます。

問題と解説を読む

先に自力で考えてから、解答を開いてください。

データベースの検索・更新・同時利用などを管理するソフトウェアは?

DBMS

DBMSがデータベースを管理するソフトウェアです。保存されたデータ自体とは区別します。

  • DNS:DNSはドメイン名の名前解決などを担います。
  • ブラウザ:ブラウザはWebページを利用するソフトです。
  • 主キー:主キーは表の行を識別する項目です。
注文表の一行「O101・C01・2」を指す言葉は?

レコード

一件の注文を表す行がレコードです。

  • フィールド:フィールドは注文IDや数量などの列です。
  • DBMS:DBMSは管理用ソフトです。
  • データ型:データ型は文字列や整数などの値の種類です。
注文表が見出しの下に3行あり、注文ID・顧客ID・数量の3列を持つ。レコード数は?

3

データの行数を数えるので3レコードです。見出しは含めません。

  • 1:表全体で一件ではありません。
  • 4:見出しをレコードに数えません。
  • 9:セルの数ではなく行数を数えます。
数量を「1以上の整数」とする制約の役割として適切なのは?

0や小数など、この数量欄で許さない値を防ぐ

許容する値を定める制約です。入力が現実と一致するかは別に確認が必要です。

  • すべての注文の事実確認を不要にする:型や範囲が正しくても注文内容の誤りはあり得ます。
  • 顧客を一意に識別する:数量は顧客の識別子ではありません。
  • 表を必ず高速化する:速度改善を必ず保証するものではありません。
注文表で一件の注文を一意に識別する主キーは、このモデルではどれ?

注文ID

注文IDは注文ごとに異なり、一行を一意に識別します。

  • 顧客名:同姓同名や同じ人の再注文を区別できません。
  • 数量:同じ数量の注文は複数あります。
  • 顧客ID:一人の顧客が複数回注文するため重複します。
C01が2回注文した。注文表の顧客IDにC01が2回現れてよい?

よい。この例では外部キーの重複を許す

一対多の関係なので、注文表の外部キーC01は複数行に現れます。

  • 主キーなので不可:注文表の主キーは注文IDです。
  • 注文IDも同じならよい:注文IDは各注文を識別するため重複できません。
  • 顧客表にもC01を2行作る必要がある:顧客表の主キーC01は一行のままです。
主キーについて正しい説明は?

行を一意に識別し、NULLを許さない

主キーは重複せず、NULLを許しません。複数列の組合せの場合もあります。

  • NULLを必ず一行に許す:主キーにNULLは許しません。
  • 同じ値を何行でも許す:重複すると行が一意に決まりません。
  • 必ず氏名にする:氏名は同姓同名などがあり、この例の主キーにはしません。
注文に登録済み顧客を必須とする。顧客表にないC99の注文を防ぐ制約は?

顧客IDの外部キー制約

顧客表への外部キー制約が参照先の存在を確認します。

  • 数量の整数型だけ:数量の型では顧客の存在を確認できません。
  • 表の表示順:表示順は参照整合性を保証しません。
  • 顧客名の文字色:見た目の設定はデータの制約ではありません。
C01の現在の連絡先が二つの注文行にあり、一方だけ変更した。問題は?

更新の不整合

同じ現在の事実が二通りになり、整合しなくなっています。

  • 暗号化:データを暗号で保護する話ではありません。
  • 名前解決:ドメイン名の解決ではありません。
  • 認証の成功:本人確認の成否とは別です。
注文していない顧客も管理したい。適切な設計は?

顧客表を独立させる

顧客の存在と注文の発生を別の表で表すと、注文なしでも顧客を登録できます。

  • 架空の注文を必ず作る:存在しない注文を作るとデータの意味が壊れます。
  • 顧客名を数量欄に入れる:数量欄の意味と型に合いません。
  • 全顧客を同じIDにする:顧客を区別できなくなります。
正規化の説明として適切なのは?

依存関係を考えて重複による不整合などを防ぎやすくする

データの意味と依存関係に沿って表を整理します。単純な見た目の分割ではありません。

  • 表を必ず一つにまとめる:一つにまとめることが目的ではありません。
  • すべての検索を必ず高速化する:速度は処理内容や索引などにも依存します。
  • 列を同じ数に分ける:列数をそろえても依存関係が整理されるとは限りません。
過去の注文時の配送先を履歴として保存している。顧客の現在の連絡先が変わったら?

過去と現在の事実を区別して扱う

時点の異なる事実は区別します。履歴の値を現在値に揃えると、当時の情報を失います。

  • 過去の配送先も必ず上書きする:履歴を残す目的に反します。
  • すべての注文を消す:連絡先変更は注文消去の理由ではありません。
  • 主キーを削除する:主キーを失うと注文の識別に支障が出ます。
顧客IDがC01の注文行だけを取り出す操作は?

選択

条件に合う行を取り出すので選択です。元データの削除ではありません。

  • 射影:射影は列を取り出します。
  • 結合:この操作では別の表をつないでいません。
  • 削除:結果を取り出しているだけです。
注文表から注文IDと数量の列を取り出す操作は?

射影

必要な列に着目した操作が射影です。

  • 結合:複数の表を関連づける操作ではありません。
  • 選択:条件で行を絞る話ではありません。
  • 更新:値を書き換えていません。
注文表と顧客表を正しく結合する基準は、このモデルでは?

顧客IDの一致

顧客IDという対応する値で表をつなぎます。表示順には依存しません。

  • 上から同じ位置の行:並べ替えだけで対応が変わってしまいます。
  • 文字色:見た目は表の関係を保証しません。
  • 数量の大きい順:数量の順序は顧客との対応を示しません。
O101・C01・2、O102・C02・1、O103・C01・3から、関係代数の射影で顧客IDだけを取り出す。結果は?

C01とC02の2種類

関係代数の射影では同じ行を重複させないので、C01とC02の2種類です。

  • C01だけ:C02も元の表にあります。
  • O101、O102、O103:注文IDではなく顧客IDを取り出します。
  • C01が2行、C02が1行:この設問は関係代数の射影で、重複するC01をまとめます。
一連のDB更新を成功として確定する操作は?

コミット

コミットでトランザクションを確定します。

  • ロールバック:未確定の変更を取り消す操作です。
  • 射影:必要な列を取り出す操作です。
  • 名前解決:DNSなどで行う処理です。
同一トランザクションで在庫更新後に注文登録が失敗した。確定前に全体を取り消す操作は?

ロールバック

未確定の一連の変更をロールバックし、途中の更新だけを残さないようにします。

  • コミット:成功として確定する操作なので目的と逆です。
  • 結合:表の対応をつなぐ操作ではありません。
  • 顧客表の全削除:無関係な顧客情報を削除する必要はありません。
在庫更新だけ成功した状態を残さず、注文登録と一まとまりに反映する性質は?

原子性

一連の処理を全部反映するか、反映しないかとして扱うのが原子性です。

  • 耐久性:耐久性は確定した結果を保持する性質です。
  • 射影:列を取り出す操作です。
  • 正規化:表の依存関係を整理する設計の考え方です。
二人が同時に在庫1を読み、両方とも購入可能と判断する問題への考え方は?

排他制御や条件付き更新などで同時実行を調整する

適切な同時実行制御と更新結果の確認が必要です。処理をまとめるだけでは不十分な場合があります。

  • 画面の文字色だけ変える:表示だけではDB更新の競合を防げません。
  • 顧客IDを全員同じにする:顧客を識別できなくなり、競合も解決しません。
  • トランザクションと書けば実装に関係なく解決する:分離レベルや更新方法などの設計が必要です。

← 授業一覧に戻る