忍者ブログ
情報処理技術者試験の合格を目指す全受験者のための、1問1問「徹底解説」ブログです。単なる過去問の暗記ではなく、なぜその答えになるのかを本質的に理解できるよう解説します。書籍などでは学べない最新用語やトレンドを踏まえてご紹介します。

【データベース】完全復元を保証する分割のルール!「情報無損失分解」|情報処理問題1000本ノック

データベースの正規化において、テーブルをただバラバラに分ければいいわけではありません。合体したときに100%元通りになる正しい分け方「情報無損失分解」の定義を攻略しましょう。

1. 【 問題 】:関係データベースの正規化と情報無損失分解

【 問題 】 関係データベース(RDB)の設計において、1つの表(関係)を複数の表に分割する際、分割されたすべての表を自然結合(JOIN)することによって、元の表が持っていたデータ構造や情報を、過不足なく(偽の行が発生することなく)完全に復元できるような分解のことを何と呼ぶでしょうか?

① 関数従属分解 (Functional Dependency Decomposition)
② 情報無損失分解 (Lossless-Join Decomposition)
③ 垂直結合分解 (Vertical Join 分解)
④ 非可逆的関係分解 (Irreversible Decomposition)

2. 正解:

正解: ② 情報無損失分解(じょうほうむそんしつぶんかい)

3. 解説:「損失」とは、データが消えることではなく「ゴミが増える」こと

データベースの正規化(第2正規化や第3正規化など)では、データの重複を無くすために1つの大きなテーブルを2つ以上に小分けにします。このとき、情報無損失分解になっている必要があります。

【情報無損失分解の重要な罠と成立条件】

勘違いしやすいポイント:「無損失(Lossless)」という言葉を聞くと、受験生はつい「データが消えて無くならないこと」と思ってしまいがちです。しかし、データベース理論における損失とは、「間違った分け方をしたせいで、結合したときに『元の表には無かったはずの、偽のゴミデータ(幽霊レコード)』が発生してしまい、元の情報を正しく特定できなくなる(=情報の意味が失われる)状態」を指します。 ← ココが午前試験の最大のひっかけ!

成立する条件(関数従属性):元の表を「表1」と「表2」に分けたとき、2つの表の【共通する列(結合キー)】が、表1または表2のどちらか一方において、データを1行に特定できる「主キー(または候補キー)」になっていなければなりません。このルールを守って分解すれば、結合したときに絶対に元の関係が復元できます。
[ 選択肢のひっかけポイント(それらしい造語や関連用語) ]
★ ① 関数従属分解:関数従属性(ある列が決まれば、もう一方の列も自動的に決まる関係)に基づいてテーブルを分ける行為そのもののことですが、復元可能性を保証する用語としては②が正解です。
★ ③ 垂直結合分解:テーブルを列単位で縦に切り分けることを「垂直分解」と言いますが、これ単体では情報無損失を保証する用語ではありません。
★ ④ 非可逆的関係分解:元に戻せなくなってしまうダメな分解(情報有損失分解)をイメージさせる、試験用のひっかけ造語です。

1. 理解のコツ: 「1枚の紙の書類を、ハサミで2つに切り分ける作業」に例えてみましょう。
・書類(元テーブル)に書かれた「社員名」と「所属部署」をハサミで切り離します。このとき、両方の紙切れに共通の『社員ID』を書き残しておけば(結合キー=主キー)、後からセロハンテープでペタッと貼り合わせたときに、誰がどの部署だったか100%元通りに分かります(情報無損失分解)
・もし、共通の『社員ID』を書き残さずに「名前の紙」と「部署の紙」に分けてしまうと、同じ部署に複数の社員がいた場合、合体させたときに「あれ?この部署の人はAさんだっけ?Bさんだっけ?」と、ありもしない組み合わせ(ゴミデータ)が発生して元に戻せなくなります。これが情報有損失分解です。
2. 試験対策の視点: 「関係を複数個の関係に分解しても」「結合すると必ず元の関係が持っていた情報が復元」という、正規化の正当性を担保する理論的フレーズが出たら「情報無損失分解」が一択です。基本情報や応用情報の午前試験では、データベースの正規化の手順が正しいかどうかを論理的に説明する際の根本ルールとして、また「情報無損失分解であるための条件はどれか」という数理的な問題として非常によく狙われます。


4. まとめ

「データベースの正規化において、テーブルを分割しても、結合(JOIN)によって元のデータを1ミリの狂いもなく完全復元できることを保証する、データモデル設計の絶対原則」。これが情報無損失分解です。この数理的な裏付けがあるからこそ、私たちは安心してテーブルを綺麗に正規化し、いつでも必要なときにSQLで結合して元の正しいデータを取り出すことができるのです。


PR

【データベース】並べ替えてから一気に突き合わせる!「ソートマージ結合法」|情報処理問題1000本ノック

データベースの内部結合アルゴリズム第2弾。どちらのテーブルにもインデックスがない巨大なデータ同士を、最も効率よく綺麗にパズルのように組み合わせる技法を攻略しましょう。

1. 【 問題 】:関係データベースの結合アルゴリズム(ソートマージ)

【 問題 】 データベース管理システム(DBMS)が2つの表(テーブル)を結合処理(JOIN)する際の内部アルゴリズムのうち、結合の準備段階として両方の表のデータをそれぞれの「結合キー」の順にソート(並べ替え)し、その後、ソートされた双方の表を先頭から同時に順次走査(スキャン)して、キーの一致する行同士を効率的に結合していく方式はどれでしょうか?

① 入れ子ループ法 (Nested Loops Join)
② ソートマージ結合法 (Sort Merge Join)
③ ハッシュ結合法 (Hash Join)
④ インデックススキャン法 (Index Scan)

2. 正解:

正解: ② ソートマージ結合法(Sort Merge Join)

3. 解説:足並みを揃えて、上から下に一度だけ流す

入れ子ループ法は、外側の表の行数ぶんだけ内側の表を何度も何度もループして探すため、データ量が膨大でインデックスがないと最悪のスピードになってしまいます。そこで登場するのがソートマージ結合法です。

【ソートマージ結合法の具体的なステップ】

1. ソート(整列):結合したい「表A」と「表B」を、結合キー(例:社員IDなど)の昇順(1, 2, 3...)にきれいに並べ替えます。 ← ココが問題の正解!
2. マージ(結合):並べ替えた2つの表の先頭(1番)にそれぞれポインタ(目印)を置きます。
3. 両方のキーが一致すれば合体させます。もし「表Aが3番、表Bが2番」のようにズレたら、小さい方の表Bのポインタを次の行(3番)に進めます。これをお互いの足並みを揃えながら、最後の行に向かって一方向にスキャンしていきます。

メリット:最初のソートさえ終われば、結合処理自体は「両方の表を上から下まで1回ずつなぞるだけ(2重ループしない)」で終わるため、インデックスがない巨大なテーブル同士を結合する際に、入れ子ループ法よりも圧倒的に高速に処理できます。
[ 選択肢のひっかけポイント(3大アルゴリズムのおさらい) ]
★ ① 入れ子ループ法:前回学習した、一方の表の1行に対してもう一方の表を毎回全行走査(ループ)する方式です。
★ ③ ハッシュ結合法:一方の表からメモリ上にハッシュテーブルを作って一瞬で突き合わせる方式です。並べ替え(ソート)の処理は行いません。
★ ④ インデックススキャン:これは結合のアルゴリズムではなく、インデックス(索引)を使って特定のデータを検索するアクセスメソッド(読み込み手順)の名称です。

1. 理解のコツ: 前回の「出席簿と、バラバラのテスト答案の山」の突き合わせ作業をもう一度思い出してください。
・前回は出席簿の1人ごとに、答案の山を毎回上から下までペラペラめくって探していました(入れ子ループ)。
・今回のソートマージ法は、作業を始める前に、まず「答案の山」を出席番号順(1番、2番、3番…)にきれいに並べ替えます(ソート)。出席簿も番号順に並んでいます。あとは、「出席簿の1番と答案の1番」「出席簿の2番と答案の2番」と、上から順番に1枚ずつノンストップでめくっていくだけ(マージ)です。最初の並べ替えに少し手間(コスト)がかかりますが、本番の突き合わせ作業は一瞬で終わりますよね。
2. 試験対策の視点: 「最初に両方の表をソート(並べ替え)して」「順に結合(マージ)」という、そのまんまの名前のプロセスが語られたら「ソートマージ法」が一択です。基本情報や応用情報の午前試験では、問題文の中に「あらかじめ結合キーの順に整列されている場合、最も効率的なアルゴリズムはどれか」といった形で出題されることもあります(最初からソートされているなら、ソートのコストがゼロになるためソートマージ法が超有利になります)。



4. まとめ

「インデックスのない大量のデータ同士をドッキングさせる際、最初にキー順で整列させておくことで、本番の結合処理を『上から下に1回スキャンするだけ』の超高速処理に変える職人技のような結合手法」。これがソートマージ結合法です。DBMSが裏側でデータの並び順をどう活かして計算を効率化しているかを知る、アルゴリズムの美しさが詰まった技術です。

【データベース】データの入出力を効率化する塊!DBMSの「ページ管理」|情報処理問題1000本ノック

データベースが膨大なデータを高速に処理できる秘密は、その「まとめ方」にあります。ディスクとメモリの間でデータをやり取りする最小の論理単位を攻略しましょう。

1. 【 問題 】:DBMSの物理的データ管理単位

【 問題 】 データベース管理システム(DBMS)の内部アーキテクチャにおいて、ディスク(補助記憶装置)やメモリ(主記憶装置)の間でのデータ転送(I/O処理)を効率化するために、ストレージ上の連続した物理的な記憶ブロックを一定の大きさにまとめた、データの読み書きおよび管理を行う最小の論理的な単位はどれでしょうか?

① レコード (Record)
② ページ (Page / ブロック)
③ セクタ (Sector)
④ シリンダ (Cylinder)

2. 正解:

正解: ② ページ(Page / ブロック)

3. 解説:1行ずつチマチマ運ばず、箱ごとドカンと運ぶ

データベースの性能を落とす最大のボトルネックは「ディスクの読み書き(ディスクI/O)」です。これを減らすために、DBMSはデータをページ単位で管理しています。

【ページ単位で管理する仕組みとメリット】

・ユーザーがSQL文で「社員番号10番のデータを1件だけ見せて(1レコード)」と要求したとします。
・このとき、DBMSはディスクからその1件だけをピンポイントで持ってくるのではなく、その1件が含まれている「ページ(一般的なDBMSでは4KB〜16KBの塊)」ごと丸ごとメモリ(バッファプール)に読み込みます← ココが問題の正解!

なぜそんなことをするのか?:プログラムは「近くにあるデータをついでに使う」という性質(空間的局所性)があります。ページごとまとめてメモリに載せておけば、次に「社員番号11番のデータが見たい」と言われた際、すでにメモリ(ページ内)にあるため、遅いディスクにアクセスせず一瞬でデータを返せるようになります(キャッシュ効果)。
[ 選択肢のひっかけポイント(論理単位と物理単位の混同に注意) ]
★ ① レコード:テーブルにおける「1行分のデータ」を表す論理的な単位です。ページの中には、このレコードが複数詰め込まれています。
★ ③ セクタ:ハードディスクなどの物理的なメディア側において、ハードウェアがデータを読み書きする最小の物理的単位(通常512バイト〜4KB)です。DBMSではなく、ディスクの都合の単位です。
★ ④ シリンダ:ハードディスクにおいて、中心軸から同心円状に並ぶ複数のトラック(磁気ディスクの円盤上の通り道)が、上下に重なってできる円筒状の物理的な領域のことです。

1. 理解のコツ: 「ミカンの出荷」に例えてみましょう。
・データ1件(レコード)を「ミカン1個」とします。
・お客さんから「ミカンを1個ちょうだい」と言われるたびに、遠くの畑(ディスク)まで1個だけ採りに行くのは非効率ですよね。だから、あらかじめミカンを100個ほど詰めた「ダンボール箱(ページ)」単位で収穫して、手元の店(メモリ)に並べておきます。この、データを効率よく運ぶための『ダンボール箱』の役割ページです。
2. 試験対策 of 視点: 「連続したブロックをページとして」「ページ単位でデータを管理する」という、DBMSがディスクI/Oを最適化するための基本単位に関する記述が出たら「ページ(またはブロック)」が一択です。基本情報や応用情報の午前試験では、データベースの物理設計やバッファマネージャのキャッシュアルゴリズム(LRU方式などによるページの入れ替え)を理解するための超必須の基礎知識となります。


4. まとめ

「データベースがディスクとメモリの間でデータを出し入れする際の、複数レコードをひとまとめにした最小の論理管理単位」。これがページです。私たちが高速にSQLの検索結果を受け取れている裏側では、このページという巨大な塊が、メモリとストレージの間をバケツリレーのように超高速で行き交っています。


【データベース】親がいないと存在できない!ER図の「弱実体」|情報処理問題1000本ノック

データベースの概念設計(ER図)において、実体同士の深い絆を表す概念。「自分だけの力では番号を決められない」という、依存度の高い実体の性質を攻略しましょう。

1. 【 問題 】:ER図における実体の分類

【 問題 】 データベースの概念設計で用いられるER図(実体関連図)において、自分自身が持つ「属性(カラム)」だけではデータを一意に識別(特定)することができず、関連する「他の実体(親実体)」の主キーを取り込んで初めてデータを一意に識別できるようになる実体を何と呼ぶでしょうか?

① 強実体 (Strong Entity / 独立実体)
② 弱実体 (Weak Entity / 依存実体)
③ 連関実体 (Associative Entity)
④ サブタイプ実体 (Subtype Entity)

2. 正解:

正解: ② 弱実体(じゃくじったい)

3. 解説:親の番号を借りて、初めて一人前になるデータ

テーブル設計(データモデリング)において、単体では迷子になってしまう特殊な実体が存在します。それを表す言葉が弱実体(依存実体)です。

【弱実体の具体的なビジネス例】

・会社のシステムで「社員(親実体)」テーブルと、その「家族(子実体)」テーブルがあるとします。
・家族テーブルに「第1子」「配偶者」という【続柄(属性)】だけを持たせても、日本中に同じデータが溢れてしまい、誰の家族なのか一意に識別できません。
・そこで、親である社員テーブルの主キー(例:社員番号「S001」)を借りてきて、【社員番号:S001 + 続柄:第1子】とセットにすることで、初めて世界に1人だけのデータとして一意に識別(特定)できるようになります。このときの「家族」のように、親なしでは識別できない実体を弱実体と呼びます。 ← ココが問題の正解!

※ER図の表記法(IE表記法やIDEF1Xなど)では、この弱実体を「角が丸い四角形」で表現したり、親との結びつきを「実線(依存リレーションシップ)」で表現したりして、普通のテーブルと明確に区別します。
[ 選択肢のひっかけポイント(すべてER図の高度な実体概念) ]
★ ① 強実体(独立実体):弱実体の真逆です。他のテーブルに頼ることなく、自分自身の属性(例:社員番号、商品コードなど)だけでデータを一意に識別できる普通の主役級テーブルのことです。
★ ③ 連関実体:「多対多」の関連を持つテーブル同士(例:学生と授業)を結合するために、間に挟む「履修登録」のような中間テーブル(交差実体)のことです。
★ ④ サブタイプ実体:「社員」という共通データ(スーパータイプ)に対して、「正社員」「契約社員」のように、特定のグループだけに存在する固有の属性を小分けにした子テーブルのことです。

1. 理解のコツ: 「ホテルの部屋番号と、そこに置かれたアメニティ」に例えてみましょう。
・ホテルそのものは「強実体」です。「101号室」というだけで部屋を特定できます。
・しかし、部屋の中にある「ベッド」は、単に「ベッドA」という名前(属性)だけでは、どこの部屋のベッドか分かりません。「101号室(他の実体)の、ベッドA」という関連があって初めて、清掃員が一意に識別できますよね。この、場所を借りないと特定できないベッドのような存在が弱実体です。
2. 試験対策の視点: 「自身の属性では一意に識別できない」「他の実体との関連において識別できる」という定義フレーズが来たら「弱実体(依存実体)」が一択です。基本情報や応用情報の午前試験では、リレーショナルデータベースの概念設計やER図の読み取り問題において、データの主従関係(親子関係)を正しく見抜くための必須知識として出題されます。


4. まとめ

「親となるテーブルの主キーを分け与えてもらう(依存する)ことで、ようやく自身のデータを1行に特定できるようになる子側の実体構造」。これが弱実体です。この関係性を正しくER図に表現することは、データの登録・削除ルール(親が消えたら子も消す、など)をシステムに実装する上での重要な設計図となります。


【データベース】計算で出せるデータは保存しない?「導出属性」の設計思想|情報処理問題1000本ノック

データベースのテーブル(実体)を設計する際、どの項目を保存すべきか。他の項目から自動的に計算して導き出せる「導出属性」の扱い方を攻略しましょう。

1. 【 問題 】:データモデルにおける属性の分類

【 問題 】 データベースの概念設計(ER図の作成など)において、実体(エンティティ)が持つ属性(カラム)のうち、その値をデータベース内に物理的なデータとして直接保持しなくても、他の属性の値を基に計算や加工(演算)を行うことによって自動的に導き出すことができる項目を何と呼ぶでしょうか?

① 主キー属性 (Primary Key Attribute)
② 導出属性 (Derived Attribute)
③ 複合属性 (Composite Attribute)
④ 多値属性 (Multivalued Attribute)

2. 正解:

正解: ② 導出属性(どうしゅつぞくせい)

3. 解説:データの重複を無くし、矛盾(バグ)の芽を摘む

データベースの正規化や設計においては、「無駄なデータは持たない(一元管理)」が鉄則です。その中心にある概念が導出属性です。

【導出属性の具体例と設計上のメリット】

具体例:お買い物のテーブルにおいて、「単価」と「数量」があれば、それらを掛け算することで「金額」が導き出せます。また、「生年月日」があれば、現在のシステム日付から「年齢」を導き出せます。この場合の「金額」や「年齢」が導出属性です。 ← ココが問題の正解!

なぜ物理保存を避けるのか?:もし「金額」をわざわざ固定のデータとして保存してしまうと、後から「数量を3個から2個に変更したのに、金額のデータを書き換え忘れた」というミスが起きた際、データに矛盾(バグ)が発生してしまいます。そのため、導出属性はデータとして保存せず、SQL文の中で「単価 × 数量 AS 金額」のようにその都度計算させる(またはビューや生成列を使う)のが基本デザインとなります。
[ 選択肢のひっかけポイント(すべてER図の設計に関わる属性) ]
★ ① 主キー属性:テーブル内のデータを一意に(1行だけに)識別するための、重複も空(NULL)も許されない超重要なコード(社員番号や注文IDなど)です。
★ ③ 複合属性:「住所」という項目の中に「都道府県・市区町村・番地」が含まれているように、さらに細かく分解できる属性のことです(RDBの設計では通常、分解して保存します)。
★ ④ 多値属性:1人の社員に対して「保有資格」が複数あるように、1つの枠の中に複数の値が入ってしまう属性のことです(RDBでは第1正規化によって別テーブルに分離します)。

1. 理解のコツ: 「レシート」をイメージしてください。
・お店のレジで、「リンゴ 150円(単価)」を「3個(数量)」買ったとき、合計が「450円(金額)」になるのは小学生でも分かりますよね。この450円という数字は、わざわざ頭の中に暗記しておかなくても、150×3というルール(演算)さえ分かっていればいつでもその場で生み出せます。この、他の情報から後出しで計算できる項目が導出属性です。
2. 試験対策の視点: 「他の属性から演算を行うことで導出できる」「単価と数量から金額」というドンピシャの例え話が来たら導出属性が一択です。基本情報や応用情報の午前試験では、概念データモデル(リレーション)を正しく設計できているかを問う問題や、システム設計の「無駄なデータを持たせない」という正規化の思想の基本としてよく出題されます。


4. まとめ

「データベースの容量を節約し、かつデータの計算ミス(不整合)を防ぐため、他のデータからの計算によってその都度導き出すべき項目」。これが導出属性です。パフォーマンスの都合であえて物理保存する(サマリーテーブルを作る)場合もありますが、基本設計の段階では「計算で出せるものは、元データだけをスマートに持つ」というこの思想がデータモデリングの土台となります。

【データベース】データの独立性を守る3大設計図!「3層スキーマ」|情報処理問題1000本ノック

プログラムの変更がデータベースに影響しないようにする魔法の壁。ビュー、テーブル、物理ディスクの3つの視点を整理する「3層スキーマ」を攻略しましょう。

1. 【 問題 】:データベースの3層スキーマ構造

【 問題 】 データベースの設計思想において、データの独立性を高めるためにデータを「外部スキーマ」「概念スキーマ」「内部スキーマ」の3つの階層に分けて定義する「3層スキーマ構造」に関する記述のうち、最も適切なものはどれでしょうか?

① 外部スキーマは、ハードディスク上の物理的なデータの配置やインデックスの構造を定義する。
② 概念スキーマは、個々のユーザーやアプリケーションプログラムが必要とするデータの見取り図(ビュー)を定義する。
③ 内部スキーマは、データベース化の対象となる現実世界のデータ全体を、論理的なデータモデル(テーブル構造)として定義する。
④ 概念スキーマの変更が外部スキーマに影響を与えない性質を「論理的データ独立性」、内部スキーマ(物理構成)の変更が概念スキーマに影響を与えない性質を「物理的データ独立性」と呼ぶ。

2. 正解:

正解: ④ 概念スキーマの変更が外部スキーマに影響を与えない性質を「論理的データ独立性」、内部スキーマ(物理構成)の変更が概念スキーマに影響を与えない性質を「物理的データ独立性」と呼ぶ。

3. 解説:誰から見たデータか?3つの視点をスッキリ分離

3層スキーマ構造の目的は、「データ構造や保存場所が変わっても、プログラム(システム)を書き直さなくて済むようにする(データの独立性)」ことです。そのために、役割を3つの階層に分けています。

【3層スキーマの定義と役割】

■ 外部スキーマ(利用者・プログラムの視点)
役割:個々のユーザーやアプリケーションが「見たい形」にカスタマイズした設計図です。関係データベース(RDB)では「ビュー(仮想テーブル)」などがこれに該当します。

■ 概念スキーマ(データベース全体の論理的視点)
役割:開発者やDBMSから見た、データベース全体の「本来のテーブル構造(論理構造)」です。データの重複を無くす「正規化」を行い、実体の「テーブル」として定義します。

■ 内部スキーマ(ハードウェア・物理の視点)
役割:データを「ハードディスクやSSDのどこに、どうやって保存するか」「インデックス(索引)をどう配置するか」という、物理的なファイル構成を定義する設計図です。
[ 選択肢のひっかけポイント(すべて主語が入れ替わっている罠) ]
★ ①:ハードディスク上の物理的な配置を定義するのは「内部スキーマ」です。
★ ②:ユーザーやプログラムが必要とする見取り図(ビュー)を定義するのは「外部スキーマ」です。
★ ③:データ全体を論理的なテーブル構造として定義するのは「概念スキーマ」です。
→ 正解の④は、この3層に分けることで「物理構成(内部)を変えてもテーブル(概念)は壊れない(物理的独立性)」「テーブル(概念)を多少いじってもビュー(外部)で吸収できる(論理的独立性)」という最大のメリットを正しく説明しています。

1. 理解のコツ: 「一戸建ての家」に例えてみましょう。
・住人が毎日目にする「リビングやキッチンの内装(使いやすさ)」が外部スキーマです。
・大工さんや建築士が共有する「柱の位置や部屋の間取り図面(全体の構造)」が概念スキーマです。
・床下の基礎工事や「コンクリート、鉄骨の物理的な配置」が内部スキーマです。
もし「床下の鉄骨を最新の頑丈なものに変えた(内部の変更)」としても、部屋の間取り(概念)や住人の暮らし(外部)には何も影響しませんよね。これがデータの独立性です。
2. 試験対策の視点: 「外部=ビュー(利用者側)」「概念=テーブル(全体論理)」「内部=ディスク(物理保存)」という対応関係のペアを絶対に脳内でブレさせないようにしてください。基本情報・応用情報の午前試験では、各スキーマの定義をシャッフルしたひっかけ問題や、「論理的/物理的データ独立性」という言葉の意味を問う問題が非常によく狙われます。


4. まとめ

「データベースの設計図を、プログラム側の都合(外部)、データ全体の構造(概念)、ストレージの都合(内部)の3つに切り離し、お互いの変更が響かないようにする工夫」。これが3層スキーマです。この思想があるからこそ、私たちはインフラのハードウェアを増強(内部を変更)しても、今動いている業務システム(外部)を一切止めることなく、そのまま使い続けることができるのです。


【データベース】データの出し入れを直接担うコア部品!「ストレージエンジン」|情報処理問題1000本ノック

データベース管理システム(DBMS)の内部で、実際にハードディスクやメモリにアクセスしてデータを書き換えているのは誰か?その心臓部となるコンポーネントを攻略しましょう。

1. 【 問題 】:DBMSの内部構成とコンポーネント

【 問題 】 データベース管理システム(DBMS)を構成するソフトウェアモジュール(コンポーネント)のうち、ユーザーが発行したSQL文の要求に基づき、メモリ(バッファプール)やディスクなどの物理ストレージ上にある実際のデータブロックを操作し、データの検索、追加、更新、削除(CRUD処理)を直接管理・実行するコアな部品はどれでしょうか?

① クエリオプティマイザ (Query Optimizer)
② ストレージエンジン (Storage Engine)
③ トランザクションマネージャ (Transaction Manager)
④ データディクショナリ (Data Dictionary)

2. 正解:

正解: ② ストレージエンジン(Storage Engine)

3. 解説:SQLの命令を「物理的な動き」に変える心臓部

DBMSの内部は、いくつかの役割を持ったコンポーネントがチームワークで動いています。今回の正解であるストレージエンジンは、文字通りデータの「倉庫(ストレージ)」を動かす「エンジン(動力源)」です。

【ストレージエンジンの役割と具体例】

・ユーザーが「このデータを更新して」というSQL文を送ると、DBMSの上層部(クエリプロセッサ)がそれを解析します。
・その解析結果を受けて、実際に「ハードディスクの〇番地にあるデータを読み出す」「メモリ上のデータを書き換える」といった、最も泥臭い物理的なデータの出し入れ(検索や更新)を一手に引き受けるのがストレージエンジンです。 ← ココが問題の正解!

※有名なオープンソースのデータベース「MySQL」では、標準のストレージエンジンとして高い信頼性を持つ「InnoDB」が使われているほか、用途に応じて「MyISAM」や「Memory」といった異なる特性のストレージエンジンへ自由に入れ替える(差し替える)ことができる構造になっています。
[ 選択肢のひっかけポイント(すべてDBMSの超重要コンポーネント) ]
★ ① クエリオプティマイザ:送られてきたSQL文を見て、「どのインデックスを使えば一番速く検索できるか」という最適な実行計画(ルート)を自動で計算・決定する頭脳です。
★ ③ トランザクションマネージャ:データの排他制御(ロック)や、処理の確定(コミット)・取り消し(ロールバック)を管理し、データの整合性を守る司令塔です。
★ ④ データディクショナリ:テーブルの名前や列のデータ型、主キーの設定といった、データベース自身の設計図情報(メタデータ)を保管しているシステム領域です。

1. 理解のコツ: 「レストラン」に例えてみましょう。
・お客さんから注文(SQL)を取り、一番効率よく料理を出す順番(実行計画)を考えるフロア長がクエリオプティマイザです。
・それに対して、指示を受けて実際に冷蔵庫(ディスクやメモリ)を開け、肉や野菜(実際のデータ)を取り出して包丁で刻んだり炒めたり(検索や更新)する現場の「料理人」ストレージエンジンです。実務を直接動かすエンジンそのものです。
2. 試験対策の視点: 「DBMSのコンポーネント」「メモリやディスク上のデータ」「検索や更新を管理(直接操作)」という記述があれば「ストレージエンジン」が一択です。基本情報や応用情報の午前試験では、データベースの「外側(SQL文の使い方)」だけでなく、このように「内側(DBMSがどうやってデータを処理しているか)」のアーキテクチャを問う問題として非常に好まれる応用キーワードです。


4. まとめ

「SQLによる命令を具体的なディスクやメモリへのアクセスに翻訳し、データの検索・更新を物理的に実行する、DBMSの最下層で働く心臓部」。これがストレージエンジンです。普段私たちが何気なく叩いているSQL文の裏では、このストレージエンジンがミリ秒単位で超高速にデータをさばいてくれています。


【データベース】実務のデファクトスタンダード!「Read Committed」|情報処理問題1000本ノック

データの安全性とシステムの処理速度。その2つが最も実用的なバランスで妥協(トレードオフ)した、実務で最頻出の分離レベル「Read Committed」を攻略しましょう。

1. 【 問題 】:トランザクション分離レベルの識別

【 問題 】 ANSI/ISOで定義されている4段階のトランザクション分離レベルのうち、他のトランザクションがコミット(確定)していない未確定の変更データの読み取り(ダーティリード)は防止されるが、自身の処理中に他のトランザクションがデータを更新・追加することによって発生する「ノンリピータブルリード」および「ファントムリード」の発生は許容されるものはどれでしょうか?

① Read Uncommitted (未コミット読み取り)
② Read Committed (コミット済み読み取り)
③ Repeatable Read (反復可能読み取り)
④ Serializable (直列化可能)

2. 正解:

正解: ② Read Committed(コミット済み読み取り)

3. 解説:「確定した事実」だけを信じる世界

Read Committedは、名前の通り「コミット(確定)されたデータだけを読み取る」というルールです。これにより、存在しない幻のデータを読んでしまう最悪の事態(ダーティリード)は100%防げます。

【なぜ他の2つの現象は起きてしまうのか?】

■ ノンリピータブルリードが起きる理由
・自分が1回目の読み込みをした後、他のトランザクションがデータを変更してコミットを完了したとします。
・Read Committedのルールは「コミットされたら読んでも良い」なので、自分が2回目の読み込みをすると、他人が確定させた最新の値(書き換わった後の値)が見えてしまいます。これが「同じ処理の中で、2回同じ場所を読んだのに値が変わってしまう(ノンリピータブルリード)」の原因です。

■ ファントムリードが起きる理由
・同様に、自分が検索した後に他人が新しいデータを挿入してコミットを完了すると、2回目の検索では、1回目には存在しなかったはずの「新しい行(ファントム)」が出現してしまいます。
[ 4段階のレベルと不整合の対応関係 ]
1. Read Uncommitted = 【全て発生】(最速・最危険)
2. Read Committed【ダーティ防止、残り2つは発生】(実務の標準) ← ココ!
3. Repeatable Read = 【ダーティ・ノンリピ防止、ファントムのみ発生】
4. Serializable = 【全て防止】(最堅牢・最遅)

1. 理解のコツ: 「オフィシャルの記者発表」をイメージしてください。まだ噂段階の未確定情報には一切耳を貸さず、公式発表(コミット)された情報だけを記事にするため、デマ(ダーティリード)を掴むリスクはありません。しかし、公式発表が朝と夕方で更新されれば、手元のニュース内容が変わる(ノンリピータブルリード)のは受け入れる、というスタンスです。
2. 試験対策の視点: 「ダーティリードは防ぐ(許容されない)」「ノンリピータブルリードとファントムリードは発生する(許容される)」という組み合わせが来たらRead Committedが一択です。多くのデータベースシステムでデフォルト(初期設定)に採用されているため、問題文での登場回数が圧倒的に多い最重要レベルです。


4. まとめ

「嘘のデータは読まないが、他人が確定させた最新の変化はそのまま受け入れる分離レベル」。これがRead Committedです。データの一貫性をある程度保ちつつ、データベースに余計なロック(待ち時間)をかけないため、大規模なアクセスを捌く現代のシステムにおいて最もバランスの良い設定とされています。


【データベース】最速だけど最も危険!ダーティリードを許す「Read Uncommitted」|情報処理問題1000本ノック

データの正確性と、同時処理のスピードはトレードオフの関係にあります。今回は、4段階ある「トランザクション分離レベル」の中で最も制約が緩いレベルを攻略しましょう。

1. 【 問題 】:トランザクション分離レベル

【 問題 】 ANSI/ISOで定義されている4段階のトランザクション分離レベル(アイソレーションレベル)のうち、他のトランザクションがコミット(確定)していない未確定の変更データを読み取る現象(ダーティリード)の発生を許容するものはどれでしょうか?

① Read Uncommitted (未コミット読み取り)
② Read Committed (コミット済み読み取り)
③ Repeatable Read (反復可能読み取り)
④ Serializable (直列化可能)

2. 正解:

正解: ① Read Uncommitted(未コミット読み取り)

3. 解説:ロックをかけずにフライング読み込み

トランザクション分離レベルは、複数の処理が同時に動くときの「お互いの独立性の高さ」を表します。レベルが低いほど処理スピード(スルーブット)は上がりますが、不整合が起きやすくなります。

【4つの分離レベルと発生する現象のまとめ】

下に行くほどレベルが高く(厳格に)なり、有害な現象をブロックできます。

1. Read Uncommitted(←ココが正解!
・特徴:他人が書き換えている最中のデータを「お構いなし」に読めます。
・発生する不整合:ダーティリード、ノンリピータブルリード、ファントムリード

2. Read Committed
・特徴:他人がコミットした(確定した)データだけを読みます。
・発生する不整合:ダーティリードを防ぐ(ブロックする)。残り2つは発生。

3. Repeatable Read
・特徴:自分の処理中に、他人がデータを書き換えても自分には見えません。
・発生する不整合:ファントムリード(行が追加される現象)のみ発生。

4. Serializable
・特徴:すべての処理を順番に1つずつ実行するのと同様の状態にします。
・発生する不整合:すべての有害な現象を完璧に防ぎます(最も安全)。
[ 選択肢のひっかけポイント ]
★ ②:Read Committed(コミット済み読み取り)は、名前の通り「コミットされたデータしか読まない」レベルなので、ダーティリードは発生しません。

1. 理解のコツ: 「書類の承認プロセス」をイメージしてください。まだ上司のハンコ(コミット)が押されていない、作成中の下書き書類を勝手にデスクから持ち出して使い始めてしまうレベルがRead Uncommitted(未コミット読み取り)です。書類が後から破棄(ロールバック)されるリスクがありますが、完成を待たずにすぐ動けるのでスピードだけは最速です。
2. 試験対策の視点: 「ダーティリードを許容する」「最も分離レベルが低い」という条件が来たら「Read Uncommitted」が一択です。試験では、この4つの分離レベルと、3大有害現象(ダーティ/ノンリピータブル/ファントム)が「どこまで防げるか」の対応表を丸暗記しておくことが、データベース分野の得点王への近道です。


4. まとめ

「他の処理が確定していないデータでも、お構いなしに読み取ってしまう最も低い分離レベル」。これがRead Uncommittedです。お金の計算など、1円の狂いも許されないシステムでは絶対に選んではいけない設定ですが、多少の誤差が許される統計データの集計など、速度を限界まで追い求めたいケースで限定的に使われます。


【データベース】フライング厳禁!幻のデータを読んでしまう「ダーティリード」|情報処理問題1000本ノック

複数の処理が同時に動くとき、未確定のデータを盗み見てしまうことで発生するバグ。データの一貫性を損なう代表的な現象「ダーティリード」を攻略しましょう。

1. 【 問題 】:同時実行制御における有害現象

【 問題 】 データベースの同時実行制御において、あるトランザクションが更新処理を行ったがまだコミット(確定)していない状態のデータを、別のトランザクションが読み込んでしまう現象を何と呼ぶでしょうか?

① ノンリピータブルリード(非再現可能読み取り)
② ダーティリード(Dirty Read)
③ ファントムリード(幻像読み取り)
④ ライトスキュー(Write Skew)

2. 正解:

正解: ② ダーティリード(Dirty Read)

3. 解説:コミット前の「怪しいデータ」に手を出した結果

ダーティリードの「ダーティ(汚れた)」とは、まだ正式に承認されていない、不正確な状態のデータを指します。これが起きると、システム全体の数字が狂う原因になります。

【ダーティリードが引き起こす最悪のシナリオ】

1. トランザクションAが、口座残高を「1万円」から「5万円」に書き換える(※まだコミットしていない)。
2. トランザクションBが、その書き換えられた「5万円」を読み取って別の処理を始める(これがダーティリード)。
3. その直後、トランザクションAでエラーが発生し、処理がロールバック(取り消し)され、残高は元の「1万円」に戻る。
→ 結果として、トランザクションBは「現実に存在しない(幻の)5万円」をベースに処理を進めてしまい、データが完全に矛盾します。
[ 防ぐための分離レベル ]
★ 最も低いレベルの「Read Uncommitted」では発生してしまいますが、一段階上の「Read Committed(確定データの読み取り)」以上の設定にすれば、このダーティリードは完全に防ぐことができます。

1. 理解のコツ: 「お店のレジ」をイメージしてください。店員さんが商品をカゴに入れながら「合計5,000円です」と画面に出した(未コミット)のを見て、あなたが財布から5,000円を出そうとした瞬間、「あ、すいません、今の商品2倍の値段でした!」と取り消されたような状態です。確定する前の数字を信じて行動すると、トラブルになりますよね。
2. 試験対策の視点: 「コミットされていない変更を読み取る」「ロールバックによって存在しないデータを参照してしまう」という記述があればダーティリードが一択です。3大有害現象(ダーティ、ノンリピータブル、ファントム)の中で最も基礎的であり、真っ先に防ぐべき現象として出題されます。


4. まとめ

「他のトランザクションが確定していない、取り消される可能性のあるデータを読み込んでしまう現象」。これがダーティリードです。これが発生しないよう、現代のほとんどのRDBMSでは、デフォルトでこの現象をブロックする設定(Read Committed以上)になっています。


        
  • 1
  • 2
  • 3