問題 12★★★

社内研修の申込を、申込番号・社員名・研修コード・研修名・開催日を1行にもつ 申込表だけで管理している。申込者が1人だけの研修で取消しがあり、その行を 削除したところ、研修名と開催日もデータベースから消えた。 この原因として最も適切なものはどれか。

正解:ア

各選択肢の解説

  1. ア研修名と開催日を、申込1件ごとの行の中にだけ記録していたこと。

    正解。研修そのものを表す表がなく、研修の情報が申込の行に書き添えられて いるだけなので、申込の行が消えると研修の情報も道連れになります。 研修コードごとに1行の研修の表へ分ければ、申込がゼロでも研修は残ります。

  2. イ行を削除する前に、申込表のバックアップを取っていなかったこと。

    誤り。バックアップは失ったデータを後から戻すための備えです。取ってあれば 復元はできますが、表の形が同じままでは、最後の申込者が取り消すたびに 研修の情報は運用中のデータベースから消えます。原因は表の設計にあります。

  3. ウ研修コードで検索するためのインデックスを設定していなかったこと。

    誤り。インデックスは本の索引のように、目的の行を速く探すための仕組みです。 検索の速さには効きますが、データそのものを保持する場所ではないので、 あってもなくても行を削除すれば研修名と開催日は一緒に消えます。

  4. エ行を一意に特定する主キーに、研修コードではなく申込番号を選んだこと。

    誤り。申込表の行は申込1件ごとなので、主キーは申込番号で適切です。 研修コードを主キーにすると、1つの研修に1行しか持てず2人目の申込を 記録できなくなります。問題は主キーではなく、研修の情報の置き場所です。

理解を深めるために

申込の紙に研修の案内を書いていた

研修の案内を、申込用紙の余白にだけ書き写していたとします。申込者が1人しか いない研修でその申込用紙を捨てれば、研修名も開催日も手元から消えてしまいます。 研修の案内を別の台帳に1枚ずつ持っていれば、申込が何件あっても、ゼロになっても 案内は残ります。

なぜ研修の情報まで消えたのか

問題文の申込表には、性質の違う2種類の情報が混ざっています。

  • 申込の情報 … 申込番号、社員名(申込1件ごとに決まる)
  • 研修の情報 … 研修名、開催日(研修コードが決まれば決まる)

研修の情報は研修コードで決まるのに、置き場所は申込の行しかありません。 そのため、ある研修の申込の行がすべてなくなると、その研修が存在したこと自体を 記録する場所がなくなります。行を削除したときに、消したくない情報まで消えるこの現象は 削除時の異常と呼ばれ、正規化していない表で起こる典型的な問題です。

正規化で表を次のように分ければ解消します。

  • 研修の表 … 研修コード、研修名、開催日(1研修につき1行)
  • 申込の表 … 申込番号、社員名、研修コード

申込の行を消しても、研修の表の行はそのまま残ります。

混同しやすいものとの違い

用語 何のためのものか
正規化 情報を性質ごとの表に分け、1か所にだけ持つようにする
バックアップ 失ったデータを別に保管した複製から戻す
インデックス 目的の行を速く探せるようにする
主キー 表の中の行を一意に特定する

「データが消える」「食い違う」という事態が、操作の誤りではなく表の形から 起きていると読み取れたら、正規化の問題だと判断します。

前の問題へ次の問題へ