第8章 設計と運用
更新日:2025年12月28日
この章を音声で聴く
1. ER図
ER図(Entity-Relationship Diagram)は、データベースの論理構造を視覚的に表現するための図である。Peter Chenが1976年に提唱した。
1.1 エンティティと属性
エンティティ(Entity):データベースで管理する対象。テーブルに対応する。
属性(Attribute):エンティティの特性。テーブルの列に対応する。
Table 1. ER図の基本要素
| 要素 | 記号(Chen記法) | 記号(IE記法) | 説明 |
|---|---|---|---|
| エンティティ | 長方形 | 長方形 | 管理対象(例:顧客、商品) |
| 属性 | 楕円 | 長方形内に列挙 | エンティティの特性(例:氏名、価格) |
| 主キー | 下線付き属性 | PK表記 | 一意識別子 |
| リレーションシップ | 菱形 | 線(カーディナリティ記号付き) | エンティティ間の関連 |
1.2 リレーションシップ
リレーションシップは、エンティティ間の関連を表す。カーディナリティ(多重度)で関連の数量関係を示す。
Table 2. カーディナリティの種類
| 種類 | 記号 | 説明 | 例 |
|---|---|---|---|
| 1対1 | 1:1 | 一方に1つ、他方にも1つ | 社員と社員証 |
| 1対多 | 1:N | 一方に1つ、他方に複数 | 部署と社員 |
| 多対多 | M:N | 両方に複数 | 学生と講義 |
Fig. 1. ER図の例(受注システム)
多対多(M:N)の関係は、RDBでは直接表現できない。中間テーブル(連関エンティティ)を作成し、2つの1対多(1:N)に分解する。例:学生-受講-講義
-- 多対多の解消例
-- 学生テーブル
CREATE TABLE students (
student_id INTEGER PRIMARY KEY,
name VARCHAR(100)
);
-- 講義テーブル
CREATE TABLE courses (
course_id INTEGER PRIMARY KEY,
title VARCHAR(200)
);
-- 中間テーブル(受講)
CREATE TABLE enrollments (
student_id INTEGER,
course_id INTEGER,
enrolled_date DATE,
PRIMARY KEY (student_id, course_id),
FOREIGN KEY (student_id) REFERENCES students(student_id),
FOREIGN KEY (course_id) REFERENCES courses(course_id)
);
2. テーブル設計
テーブル設計は、ER図を基にして具体的なテーブル構造を決定するプロセスである。
Table 3. テーブル設計のチェックリスト
| 項目 | 確認内容 |
|---|---|
| 主キー | 一意性、非NULL、変更されにくい値か |
| 正規化 | 第3正規形まで正規化されているか |
| データ型 | 適切なデータ型と桁数が選択されているか |
| 制約 | NOT NULL、UNIQUE、CHECK制約が適切か |
| 外部キー | 参照整合性が確保されているか |
| 命名規則 | 一貫性のある命名がされているか |
| インデックス | 検索性能を考慮したインデックスがあるか |
Table 4. 命名規則の例
| 対象 | 規則 | 例 |
|---|---|---|
| テーブル名 | 複数形、スネークケース | employees, order_details |
| 列名 | スネークケース | first_name, created_at |
| 主キー | テーブル名_id または id | employee_id, id |
| 外部キー | 参照先テーブル名_id | department_id |
| インデックス | idx_テーブル名_列名 | idx_employees_name |
3. トランザクション
3.1 ACID特性
トランザクション(Transaction)は、データベース操作の論理的な単位である。複数の操作を一つのまとまりとして扱い、すべて成功するか、すべて失敗するかのいずれかを保証する。
Table 5. ACID特性
| 特性 | 英語 | 説明 |
|---|---|---|
| 原子性 | Atomicity | トランザクション内の操作はすべて成功するか、すべて失敗する |
| 一貫性 | Consistency | トランザクション前後でデータの整合性が保たれる |
| 独立性 | Isolation | 同時実行される他のトランザクションの影響を受けない |
| 耐久性 | Durability | コミット後のデータは永続的に保存される |
-- トランザクションの基本
BEGIN TRANSACTION; -- または START TRANSACTION;
-- 銀行振込の例
UPDATE accounts SET balance = balance - 10000 WHERE account_id = 'A001';
UPDATE accounts SET balance = balance + 10000 WHERE account_id = 'B001';
-- 成功時
COMMIT;
-- 失敗時(ロールバック)
ROLLBACK;
-- セーブポイントの使用
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 10000 WHERE account_id = 'A001';
SAVEPOINT sp1;
UPDATE accounts SET balance = balance + 10000 WHERE account_id = 'B001';
-- エラー発生時、sp1まで戻す
ROLLBACK TO sp1;
COMMIT;
3.2 ロック
ロック(Lock)は、複数のトランザクションが同時にデータにアクセスする際の競合を制御する仕組みである。
Table 6. ロックの種類
| ロック種類 | 別名 | 説明 | 他の読み取り | 他の書き込み |
|---|---|---|---|---|
| 共有ロック | Sロック、読み取りロック | 読み取り用 | 可 | 不可 |
| 排他ロック | Xロック、書き込みロック | 書き込み用 | 不可 | 不可 |
Table 7. トランザクション分離レベル
| 分離レベル | ダーティリード | ノンリピータブルリード | ファントムリード |
|---|---|---|---|
| READ UNCOMMITTED | 発生する | 発生する | 発生する |
| READ COMMITTED | 防止 | 発生する | 発生する |
| REPEATABLE READ | 防止 | 防止 | 発生する |
| SERIALIZABLE | 防止 | 防止 | 防止 |
デッドロックは、複数のトランザクションが互いにロックを待ち合う状態である。DBMSは通常、デッドロックを検出し、一方のトランザクションを強制終了する。デッドロックを防ぐには、ロック取得の順序を統一する、トランザクションを短くする、タイムアウトを設定するなどの対策がある。
4. バックアップ
バックアップは、データの損失に備えてデータベースの複製を作成することである。障害発生時のリカバリに不可欠である。
Table 8. バックアップの種類
| 種類 | 説明 | メリット | デメリット |
|---|---|---|---|
| フルバックアップ | データベース全体を複製 | リストアが簡単 | 時間とストレージを消費 |
| 差分バックアップ | 前回のフルバックアップ以降の変更 | バックアップが高速 | リストアにフル+差分が必要 |
| 増分バックアップ | 前回のバックアップ以降の変更 | 最も高速、省スペース | リストアが複雑 |
# MySQLのバックアップ
mysqldump -u root -p database_name > backup.sql
# MySQLのリストア
mysql -u root -p database_name < backup.sql
# PostgreSQLのバックアップ
pg_dump -U postgres database_name > backup.sql
# PostgreSQLのリストア
psql -U postgres database_name < backup.sql
# SQLiteのバックアップ(ファイルコピー)
cp database.db backup.db
バックアップ運用の指針
Point 1:定期的なバックアップスケジュールを設定する(例:日次フル、時間ごとの増分)
Point 2:バックアップファイルを複数の場所に保管する(3-2-1ルール:3つのコピー、2種類のメディア、1つはオフサイト)
Point 3:定期的にリストアテストを実施し、バックアップの有効性を確認する
Point 4:バックアップの保持期間を決め、古いバックアップを削除する
5. まとめ
Table 9. 第8章のまとめ
| 概念 | 内容 |
|---|---|
| ER図 | エンティティ、属性、リレーションシップの視覚化 |
| カーディナリティ | 1:1、1:N、M:N(多対多は中間テーブルで解消) |
| テーブル設計 | 正規化、命名規則、制約の設定 |
| ACID特性 | 原子性、一貫性、独立性、耐久性 |
| トランザクション | BEGIN、COMMIT、ROLLBACK、SAVEPOINT |
| ロック | 共有ロック、排他ロック、デッドロック |
| 分離レベル | READ UNCOMMITTED〜SERIALIZABLE |
| バックアップ | フル、差分、増分、リストアテスト |
本コンテンツは2025年12月時点の情報に基づいて作成されています。データベースの設計と運用は要件により大きく異なります。本番環境での運用は十分なテストと専門家のレビューを経て行ってください。