2-3 データベース
データベース
データベースは、業務で扱うデータを一定のルールで蓄積し、矛盾を抑えながら検索・更新できるようにする仕組みです。ITパスポートでは、表の用語を覚えるだけでなく、主キーと外部キーの役割、表を分ける理由、複数処理を安全に完了させる方法を判断する問題が出題されます。
この節の目標は、業務データを関係データベースとして整理し、選択・射影・結合、正規化、トランザクション、障害回復の考え方を具体例から説明できるようになることです。
1. データベースとDBMSの役割
| 用語 | 内容 | 役割 |
|---|---|---|
| データベース | 一定の構造で整理されたデータの集合 | 顧客、商品、注文などを蓄積する |
| DBMS | データベースを管理するソフトウェア | 検索、更新、権限、同時実行、回復を制御する |
| RDBMS | 表形式の関係データベースを管理するDBMS | 行と列、キー、表同士の関係を扱う |
| NoSQL | 表形式以外も含む柔軟なデータモデル | KVS、文書指向、グラフ指向などがある |
表計算ファイルでもデータは保存できますが、多人数が同時に更新する業務では、整合性、アクセス権、検索性能、障害回復などをDBMSで管理する利点があります。
2. 表・行・列・キーを区別する
| 用語 | 意味 | 注文管理の例 |
|---|---|---|
| テーブル | 同じ種類のデータをまとめた表 | 顧客表、商品表、注文表 |
| レコード | 1件分のデータ | 1人の顧客、1件の注文 |
| フィールド | データの項目 | 顧客名、商品番号、数量 |
| 主キー | レコードを一意に識別する項目 | 顧客番号、注文番号 |
| 外部キー | 別表の主キーを参照する項目 | 注文表の顧客番号 |
| インデックス | 検索を速くするための索引 | 顧客名や注文日の検索を高速化する |
主キーは各行を一意に識別するため、同じ値を重複させません。外部キーは別の表との関係を示し、存在しない顧客番号を注文表へ登録させないなど、参照整合性を守るために使います。
3. 完全ケース:注文データを表に分ける
次の情報を1枚の表へ保存しているとします。
| 注文番号 | 注文日 | 顧客番号 | 顧客名 | 顧客住所 | 商品番号 | 商品名 | 単価 | 数量 |
|---|---|---|---|---|---|---|---|---|
| O1001 | 7月1日 | C01 | 山田商店 | 東京 | P10 | ノート | 200 | 5 |
| O1002 | 7月2日 | C01 | 山田商店 | 東京 | P20 | ペン | 100 | 10 |
このままでは、山田商店の住所を変更するとき、該当する全行を修正しなければなりません。一部だけ更新すると住所が矛盾します。
そこで次のように分けます。
- 顧客表:顧客番号、顧客名、住所
- 商品表:商品番号、商品名、単価
- 注文表:注文番号、注文日、顧客番号
- 注文明細表:注文番号、商品番号、数量
顧客名や住所は顧客表に一度だけ保存し、注文表から顧客番号で参照します。商品名や単価も商品表で管理します。これにより重複を減らし、更新時の矛盾を防ぎます。このように表を適切に分ける考え方が正規化です。
4. データ操作を目的で選ぶ
ITパスポートでは、細かなSQL文法より、どの操作が何をするかが重要です。
| 操作 | 内容 | 例 |
|---|---|---|
| 選択 | 条件に合う行を取り出す | 東京の顧客だけを抽出する |
| 射影 | 必要な列を取り出す | 顧客名と住所だけを表示する |
| 結合 | 複数表を関連付けて表示する | 注文表と顧客表を顧客番号で結ぶ |
| 挿入 | 新しい行を追加する | 新規顧客を登録する |
| 更新 | 既存の値を変更する | 顧客住所を変更する |
| 削除 | 行を取り除く | 取消済みの一時データを削除する |
「東京の顧客名だけを表示する」なら、東京という条件で行を選択し、顧客名の列を射影します。「注文番号と顧客名を一緒に表示する」なら、注文表と顧客表を結合します。
5. トランザクションで処理を一つにまとめる
トランザクションは、関連する複数の処理を一つのまとまりとして扱う考え方です。
銀行口座Aから口座Bへ1万円を振り込む場合、次の二つが両方成功しなければなりません。
- 口座Aの残高を1万円減らす。
- 口座Bの残高を1万円増やす。
途中で障害が起きて片方だけ反映されると、全体の残高が合わなくなります。そこで全処理が成功したときに確定し、失敗したときは処理前へ戻します。
| ACID特性 | 意味 | 振込での例 |
|---|---|---|
| 原子性 | 全て実行するか、全て取り消す | 出金と入金を片方だけ残さない |
| 一貫性 | 処理前後でルールを守る | 残高合計や制約を崩さない |
| 独立性 | 同時処理が互いに不正な影響を与えない | 同じ口座の更新を適切に制御する |
| 永続性 | 確定した結果を失わない | 完了した振込を障害後も保持する |
6. 同時実行と障害回復
複数の利用者が同じデータを同時に更新すると、一方の更新結果が上書きされる可能性があります。排他制御は、必要なデータを一時的に他の処理から更新できないようにし、整合性を守ります。
ただし、複数の処理が互いに相手の解放を待つと、デッドロックが発生します。DBMSは待ち時間や処理の取消しなどによって解消します。
障害回復では次の考え方を使います。
- ロールバック:未完了の処理を取り消し、処理前の状態へ戻す。
- ロールフォワード:バックアップ後の更新記録を再適用し、障害直前へ近づける。
- チェックポイント:回復処理を始める基準点を記録する。
バックアップだけでなく、更新履歴や回復手順が必要です。
7. データ品質を整えて活用する
業務データを分析する前に、表記揺れ、欠損、重複、誤入力を確認します。データクレンジングは、こうした不整合を修正・除去し、分析に使える品質へ整える作業です。
例えば「東京都」「東京」「Tokyo」が同じ地域を表しているのに別々に集計されると、分析結果を誤ります。コード体系を決め、入力規則を統一し、元データを修正します。
データの活用では次の順序を意識します。
- 目的を明確にする。
- 必要なデータを洗い出す。
- 品質を確認し、クレンジングする。
- 適切な単位で集計・分析する。
- グラフなどで可視化する。
- 結果を業務判断へつなげる。
8. よくある誤りと理由
- 主キーと外部キーを同じと考える:主キーは自表の行を識別し、外部キーは別表との関係を示します。
- 正規化は表を一つにまとめることだと考える:重複と更新矛盾を減らすため、適切に表を分けます。
- 選択と射影を混同する:選択は行、射影は列を取り出します。
- バックアップがあればトランザクション不要と考える:処理途中の整合性はトランザクションと排他制御で守ります。
- SQL文法だけを暗記する:試験では操作の目的と結果を判断することが重要です。
- データ量が多ければ価値が高いと考える:品質が悪いデータは誤った判断につながります。
9. セルフチェック
- 行を一意に識別する項目はどれか。
- 別表との関係を示す項目はどれか。
- 条件に合う行、必要な列、複数表の関連のどれを求めているか。
- 複数処理が全て成功する必要があるか。
- 同時更新、障害、データ品質のどの問題を解決しようとしているか。
理解を確認したら、第2章の練習問題と第2章の知識カードで操作とキーを判定してください。データの統計的な読み方は、基礎理論で確認できます。
公式範囲との対応
本節は、IPA「ITパスポート試験シラバス Ver.6.5」のデータベース方式、データベース設計、データ操作、トランザクション処理に対応し、DBMS、RDBMS、NoSQL、主キー、外部キー、正規化、選択・射影・結合、ACID特性、排他制御、障害回復を扱います。