読み込み中...
読み込み中...
読み込み中...
読み込み中...
読み込み中...
データベース(DB) とは、大量のデータを整理して蓄積し、効率的に検索・更新できるようにしたデータの集まりです。データベースを管理するソフトウェアを DBMS(Database Management System) といいます。
DBMSを使うことで、次のようなメリットがあります。
| 種類 | 説明 | 例 |
|---|---|---|
| 関係データベース(RDB) | データを表(テーブル)で管理。SQLで操作 | MySQL, PostgreSQL, Oracle |
| NoSQL | RDB以外のデータベースの総称。大量データの高速処理に適する | MongoDB, Redis, DynamoDB |
| 階層型データベース | データを木構造で管理。古い方式 | IMS |
| ネットワーク型データベース | データを網目状に管理。古い方式 | IDMS |
ITパスポート試験では 関係データベース(RDB) が中心です。
データベースの構造を定義したものを スキーマ といいます。スキーマは3層に分かれています。
| 層 | 名称 | 説明 |
|---|---|---|
| 外部スキーマ | ユーザービュー | ユーザーやアプリケーションから見えるデータの範囲 |
| 概念スキーマ | 論理構造 | データベース全体の論理的な構造定義(テーブル・列・関連) |
| 内部スキーマ | 物理構造 | データの物理的な格納方法(インデックス・ファイル構成等) |
3層に分けることで、ある層を変更しても他の層への影響を最小限に抑えられます(データ独立性)。例えば、物理的な格納方法を変更してもアプリケーションのプログラムを修正する必要がありません。
RDBではデータを テーブル(表) で管理します。
| 用語 | 別名 | 説明 |
|---|---|---|
| テーブル(表) | リレーション | データを格納する表 |
| 行(レコード) | タプル | 1件分のデータ |
| 列(フィールド) | 属性(アトリビュート) | データの項目(氏名、年齢等) |
| 主キー | プライマリキー | 各行を一意に識別するための列。重複・NULLは不可 |
| 外部キー | フォーリンキー | 他のテーブルの主キーを参照する列。テーブル間の関連を表す |
例: 社員テーブル
| 社員ID(主キー) | 氏名 | 部署ID(外部キー) |
|---|---|---|
| E001 | 田中太郎 | D01 |
| E002 | 鈴木花子 | D02 |
| E003 | 佐藤次郎 | D01 |
ER図 はデータベースの設計図です。データの実体(エンティティ)と実体間の関連(リレーションシップ)を図で表現します。
| 要素 | 説明 |
|---|---|
| エンティティ(実体) | 管理対象となるもの(社員、部署、商品等) |
| アトリビュート(属性) | エンティティが持つ項目(氏名、価格等) |
| リレーションシップ(関連) | エンティティ間の関係 |
リレーションシップには カーディナリティ(多重度) があります。
| 表記 | 意味 | 例 |
|---|---|---|
| 1対1 | 1つに対して1つ | 社員と社員証 |
| 1対多 | 1つに対して複数 | 部署と社員 |
| 多対多 | 複数に対して複数 | 学生と講義 |
ポイント
データベースはデータを一元管理する仕組みで、DBMS が管理を担う。RDB はデータを表(テーブル)で管理し、主キー で行を一意に識別、外部キー でテーブル間を関連づける。ER図 はエンティティ(実体)とリレーションシップ(関連)でデータ構造を設計する。
用語
SQL(Structured Query Language) は関係データベースを操作するための標準的な言語です。データの検索・追加・更新・削除からテーブルの定義まで、データベースに対するあらゆる操作をSQLで行います。
SQLは大きく3つに分類されます。
| 分類 | 名称 | 主な命令 | 用途 |
|---|---|---|---|
| DDL | データ定義言語 | CREATE, ALTER, DROP | テーブルの作成・変更・削除 |
| DML | データ操作言語 | SELECT, INSERT, UPDATE, DELETE | データの検索・追加・更新・削除 |
| DCL | データ制御言語 | GRANT, REVOKE | アクセス権限の付与・取消 |
データを検索するための最も基本的なSQL文です。
基本構文:
SELECT 列名 FROM テーブル名 — 指定した列のデータを取得SELECT * FROM テーブル名 — すべての列のデータを取得WHERE 条件 — 条件に合うデータだけを絞り込むORDER BY 列名 ASC/DESC — 昇順(ASC)/降順(DESC)に並べ替え例: 社員テーブルから部署IDが「D01」の社員を氏名の昇順で検索
SELECT emp_name FROM employee WHERE dept_id = 'D01' ORDER BY emp_name ASC
| 演算子 | 意味 | 例 |
|---|---|---|
| = | 等しい | WHERE age = 30 |
| <> | 等しくない | WHERE status <> 'inactive' |
| < , > , <= , >= | 大小比較 | WHERE price >= 1000 |
| BETWEEN | 範囲指定 | WHERE age BETWEEN 20 AND 30 |
| LIKE | パターン一致 | WHERE name LIKE '田%'(田で始まる) |
| IN | 複数値の指定 | WHERE dept_id IN ('D01', 'D02') |
| IS NULL | NULLの判定 | WHERE phone IS NULL |
集約関数 はデータをまとめて計算するための関数です。
| 関数 | 説明 | 例 |
|---|---|---|
| COUNT | 行数を数える | COUNT(*) |
| SUM | 合計を計算 | SUM(price) |
| AVG | 平均を計算 | AVG(score) |
| MAX | 最大値を取得 | MAX(salary) |
| MIN | 最小値を取得 | MIN(age) |
GROUP BY はデータをグループ化して集約関数を適用します。
例: 部署ごとの社員数を集計
SELECT dept_id, COUNT(*) FROM employee GROUP BY dept_id
HAVING はGROUP BYでグループ化した結果に対して条件を指定します(WHEREはグループ化前の条件)。
例: 社員が3人以上いる部署を表示
SELECT dept_id, COUNT(*) FROM employee GROUP BY dept_id HAVING COUNT(*) >= 3
| 操作 | SQL文 | 説明 |
|---|---|---|
| 追加 | INSERT INTO テーブル名 (列1, 列2) VALUES (値1, 値2) | 新しい行を追加 |
| 更新 | UPDATE テーブル名 SET 列名 = 値 WHERE 条件 | 既存データを更新 |
| 削除 | DELETE FROM テーブル名 WHERE 条件 | 行を削除 |
UPDATEとDELETEで WHERE句を省略すると全行が対象 になるため、注意が必要です。
SELECT文の結果を仮想的なテーブルとして保存したものが VIEW(ビュー) です。VIEW自体は実データを持たず、アクセスのたびに元のテーブルからデータを取得します。
INDEX(インデックス) はテーブルの特定の列に対する索引(目次)です。書籍の索引と同じ原理で、データの検索を高速化します。ただし、INSERT/UPDATE/DELETE時にインデックスの更新コストが発生するトレードオフがあります。検索が多いテーブルにはインデックスが有効ですが、更新が頻繁なテーブルでは逆効果になることもあります。
複数のテーブルを関連づけてデータを取得する操作です。
| 結合の種類 | 説明 |
|---|---|
| 内部結合(INNER JOIN) | 両方のテーブルに一致するデータだけを取得 |
| 左外部結合(LEFT JOIN) | 左テーブルの全行 + 右テーブルの一致する行を取得 |
| 右外部結合(RIGHT JOIN) | 右テーブルの全行 + 左テーブルの一致する行を取得 |
例: 社員テーブルと部署テーブルを結合して、社員名と部署名を取得
SELECT e.emp_name, d.dept_name FROM employee e INNER JOIN department d ON e.dept_id = d.dept_id
ポイント
SQLは DDL(定義)・DML(操作)・DCL(制御) に分類される。データ検索は SELECT文 で、WHERE・ORDER BY・GROUP BY・HAVINGを組み合わせる。JOIN で複数テーブルを結合し、内部結合と外部結合がある。VIEW = 仮想テーブル(実データなし)、INDEX = 検索高速化(更新コストとのトレードオフ)。
用語
正規化 とは、テーブルの設計を見直して、データの重複や不整合を排除するプロセスです。正規化を行うことで、データの更新時に生じる問題(更新時異常)を防止できます。
正規化を行わないと、以下のような問題が発生します。
| 段階 | 名称 | ルール |
|---|---|---|
| 第1正規形(1NF) | 繰り返しの排除 | テーブルのすべての列が単一の値を持つ(繰り返し項目を別テーブルに分離) |
| 第2正規形(2NF) | 部分関数従属の排除 | 主キーの一部だけに依存する列を別テーブルに分離(1NF前提) |
| 第3正規形(3NF) | 推移的関数従属の排除 | 主キー以外の列に依存する列を別テーブルに分離(2NF前提) |
関数従属 とは「列Aの値が決まれば列Bの値が一意に決まる」関係です。例えば「社員ID → 氏名」は関数従属です。
非正規形のテーブル(注文データ):
| 注文ID | 顧客名 | 商品1 | 単価1 | 商品2 | 単価2 |
|---|---|---|---|---|---|
| 001 | 田中 | りんご | 100 | みかん | 80 |
商品が繰り返しになっているため、正規形ではありません。
第1正規形(繰り返しの排除):
| 注文ID | 顧客名 | 商品名 | 単価 |
|---|---|---|---|
| 001 | 田中 | りんご | 100 |
| 001 | 田中 | みかん | 80 |
繰り返しを行に展開しました。しかし顧客名が注文IDだけに依存(部分関数従属)しています。
第2正規形(部分関数従属の排除):
注文テーブル:
| 注文ID | 顧客名 |
|---|---|
| 001 | 田中 |
注文明細テーブル:
| 注文ID | 商品名 | 単価 |
|---|---|---|
| 001 | りんご | 100 |
| 001 | みかん | 80 |
第3正規形(推移的関数従属の排除): 商品名→単価の推移的従属を排除する場合は、さらに商品テーブルを分離します。
| 目的 | 説明 |
|---|---|
| データの重複排除 | 同じ情報を複数箇所に持たないようにする |
| 更新時異常の防止 | 更新・挿入・削除時のデータ不整合を防ぐ |
| データの整合性確保 | 一元管理により矛盾のないデータを維持 |
正規化はデータの整合性を高めますが、過度な正規化はテーブル数が増えて結合(JOIN)が多くなり、パフォーマンスが低下する場合があります。実務では性能を考慮して、あえて正規化を崩す 非正規化(逆正規化) を行うこともあります。
判断基準の目安:
ポイント
正規化の目的: 更新時異常・挿入時異常・削除時異常の防止。第1正規形 は繰り返しの排除、第2正規形 は部分関数従属の排除、第3正規形 は推移的関数従属の排除。第3正規形まで押さえる。更新が多い → 正規化重視、読み取り中心 → 非正規化を検討。
用語
トランザクション とは、データベースに対する一連の操作をひとまとめにした処理単位です。例えば銀行の振込では「Aの口座から引き落とし」と「Bの口座に入金」の2つの操作が1つのトランザクションです。どちらか一方だけが実行されると、お金が消えたり二重に発生したりしてしまいます。
トランザクションが満たすべき4つの性質を ACID特性 といいます。
| 特性 | 英語 | 説明 |
|---|---|---|
| 原子性 | Atomicity | トランザクション内の操作は「すべて成功」か「すべて取消」のどちらか |
| 一貫性 | Consistency | トランザクションの前後でデータの整合性が保たれる |
| 独立性 | Isolation | 同時実行される他のトランザクションの影響を受けない |
| 永続性 | Durability | 完了したトランザクションの結果は障害が発生しても失われない |
トランザクションが正常に完了した場合は コミット(COMMIT) で結果を確定します。途中でエラーが発生した場合は ロールバック(ROLLBACK) で開始前の状態に戻します。
複数のトランザクションが同じデータに同時にアクセスすると、データの不整合が発生する可能性があります。これを防ぐために 排他制御(ロック) を行います。
| ロックの種類 | 説明 |
|---|---|
| 共有ロック(読み取りロック) | 他のトランザクションからの読み取りは許可するが、書き込みは禁止 |
| 専有ロック(書き込みロック) | 他のトランザクションからの読み取り・書き込みの両方を禁止 |
2つ以上のトランザクションが互いに相手のロック解放を待ち続ける状態を デッドロック といいます。
例:
DBMSはデッドロックを検知すると、一方のトランザクションを強制的にロールバックして解消します。検知方法としては、ロックの待ち合わせ関係を 待ちグラフ として監視し、循環(AがBを待ち、BがAを待つ)が検出されたら一方をロールバックします。また、一定時間ロック待ちが続いた場合にタイムアウトで解消する方式も一般的です。
データベースの障害に備えて、バックアップ と ログ(ジャーナル) を記録しておきます。
| 復旧方法 | 説明 | 使用場面 |
|---|---|---|
| ロールバック | トランザクションの開始時点まで戻す | トランザクション失敗時 |
| ロールフォワード | バックアップからログを順に適用して障害直前の状態に復元 | ディスク障害時 |
| 種類 | 説明 | 復旧速度 | バックアップ時間 |
|---|---|---|---|
| フルバックアップ | すべてのデータをバックアップ | 速い | 長い |
| 差分バックアップ | 前回のフルバックアップからの変更分をバックアップ | やや速い | 中程度 |
| 増分バックアップ | 前回のバックアップ(フル/増分)からの変更分をバックアップ | 遅い | 短い |
フルバックアップは復旧が最も速いですが、バックアップに時間がかかります。増分バックアップはバックアップは速いですが、復旧時にはすべての増分を順番に適用する必要があります。
バックアップ戦略を決定する際の重要な指標が RPO と RTO です。
| 指標 | 正式名称 | 説明 | 例 |
|---|---|---|---|
| RPO | Recovery Point Objective(目標復旧時点) | どの時点までのデータ損失を許容するか | RPO = 1時間 → 最大1時間分のデータ損失を許容 |
| RTO | Recovery Time Objective(目標復旧時間) | 障害発生から復旧完了までに許容する時間 | RTO = 4時間 → 4時間以内に復旧する |
RPO を短くするほど頻繁なバックアップやリアルタイムレプリケーションが必要になり、RTO を短くするほど高速な復旧手段(冗長構成等)が必要になります。両方ともコストとのトレードオフです。
ポイント
ACID特性: 原子性・一貫性・独立性・永続性。トランザクションの4つの性質は暗記必須。正常完了で COMMIT、エラー時は ROLLBACK する。排他制御 で同時アクセスの不整合を防ぎ、デッドロック はDBMSが検知して解消する。障害復旧には ロールバック と ロールフォワード がある。RPO(目標復旧時点)と RTO(目標復旧時間)でバックアップ戦略を決定する。
用語