🗄️

データベース入門

リレーショナルデータベースの基本概念からテーブル設計、SQLの実践、パフォーマンス最適化まで、図解とMermaidで体系的に学びます。

学習をスタートする

🗺️ ロードマップ

1

リレーショナルデータベースの基本概念

データベースとは データベース(DB)は、体系的に整理された大量のデータを効率よく保存・管理・検索するためのシステムです。ブログ、SNS、Eコマース、銀行システムなど、現代のほぼすべてのアプリケーションはデータベースを活用しています。 リレーショナルデータベース(RDB)とは リレーショナルデータベースは、データを「表(テーブル)」形式で管理するデータベースの標準的なモデルです。Excelのスプレッドシートのような構造で、行と列にデータが整理されます。 テーブルの基本用語 用語 説明 例 テーブル データを行と列で管理する表 テーブル 行(レコード) 1件のデータ 太郎さんの情報 列(カラム) 特定の属性を表す 、 主キー(PK) 各レコードを一意に識別するカラム スキーマ テーブルの構造定義 各カラムの型・制約 データ型(型付け) データベースは各カラムに「どんな形式のデータが入るか」を事前に定義します。主なデータ型は以下の通りです: リレーション(関連性) リレーショナルデータベースの名称の由来は、複数のテーブル間に関連性(リレーション)を作れる ことにあります。 例:ユーザーと注文の関係 と を紐付けることで、「どのユーザーがどの商品を注文したか」を効率的に管理 できます。このリレーションが、複雑なビジネスロジックを支える強力な機能です。 主要なRDBMS(データベース管理システム) Excelと同じように、RDBMSも複数のソフトウェアから選べます: DBMS 特徴 用途 PostgreSQL オープンソース、高機能、信頼性高 中~大規模システム MySQL 高速、軽量、シンプル Webアプリ、スタートアップ SQLite ファイルベース、セットアップ不要 モバイルアプリ、組込 Oracle Database エンタープライズ向け、超大規模対応 金融機関、大企業 Microsoft SQL Server Windows統合、ビジネス向け Windowsサーバー環境 なぜリレーショナルデータベースなのか? まとめ - リレーショナルデータベースは、行と列からなるテーブルでデータを管理します - 複数テーブル間のリレーションにより、複雑なデータ関係を効率的に表現できます - スキーマでデータ型と構造を事前に定義し、データの一貫性を保ちます - 高速検索とトランザクションにより、大規模システムでも信頼できる運用が可能です 次の章では、効率的で一貫性のあるテーブル設計に不可欠な 正規化 について学びます。

2

テーブル設計と正規化

悪いテーブル設計の例 以下のテーブルを見てください。ユーザーと彼らが借りている本の情報が混在しています: このテーブルの問題点 正規化とは 正規化(Normalization)は、データベース設計の最重要概念です。テーブルを複数に分割することで、以下を実現します: - ✅ データの重複排除 - ✅ データ更新時の矛盾防止 - ✅ ストレージ効率の向上 - ✅ クエリの高速化 正規化の段階 正規化には複数のレベル(正規形)があります。ほとんどの実務では 第3正規形(3NF) まで進めれば十分です。 第1正規形(1NF):原子性 各セルは1つの値のみ保有する という原則です。 第2正規形(2NF):部分関数従属の排除 主キーの一部に従属するカラムは分離する という原則です。複合主キーの場合に重要です。 第3正規形(3NF):推移関数従属の排除 主キー以外のカラム間に従属関係がないようにする という原則です。 正規化されたテーブル設計の例 ユーザー・注文・商品の関係を適切に設計したモデル: メリット 正規化のバランス 正規化は重要ですが、過度な正規化はパフォーマンス低下につながります。実務では、第3正規形と実装バランス を取ることが重要です。 まとめ - 正規化はデータベース設計の根本原則です - 第1~第3正規形の段階的なプロセスで、データの一貫性と効率性を両立します - ほとんどの実務では 第3正規形(3NF) で十分です - 過度な正規化は避け、実装バランスを考慮 することが大切です 次の章では、正規化されたテーブルに対して SQL を使ってデータを操作する方法を学びます。

4

インデックスとクエリ最適化

インデックスとは インデックス(索引)は、本の巻末にある「索引」と同じ役割です。データを高速に検索するためのデータ構造です。 例:ユーザーテーブルでのデータ検索 インデックスの種類 主キーインデックス(PRIMARY KEY) 各レコードを一意に識別するカラムに自動的に作成されます。 ユニークインデックス(UNIQUE) 重複を許さないカラムに対して作成します。 通常のインデックス(INDEX) よく検索に使われるカラムに対して作成します。 複合インデックス(複数カラム) 複数カラムを組み合わせて検索する場合に有効です。 インデックスの効果 データ量が多い場合、インデックスの効果は劇的です: インデックスのデメリット インデックスは万能ではありません。 デメリット 説明 ストレージ使用量 ↑ インデックスは追加のディスク領域を消費 書き込み速度 ↓ INSERT/UPDATE/DELETEのたびにインデックスも更新(遅化) メモリ消費 ↑ 頻繁に使われるインデックスはメモリに読み込まれる クエリ最適化の原則 1. インデックスが使われているか確認 2. 不要なカラムを取得しない 3. WHERE句で範囲を限定 4. 関数はWHERE句では避ける N+1クエリ問題 アプリケーション開発でよくある落とし穴です: キャッシングの活用 頻繁にアクセスされるデータをキャッシュすることで、さらに高速化できます: まとめ:パフォーマンス最適化のチェックリスト 次の章では、複数の更新操作を安全に実行するための トランザクション について詳しく学びます。

5

トランザクションとACID特性

トランザクションとは トランザクションは、複数のデータベース操作を「1つの単位」として実行する仕組みです。銀行の送金を例にすると、この概念が明確になります。 例:銀行送金 太郎さんのアカウントから花子さんのアカウントへ1000円を送金する場合: ACID特性 トランザクションが信頼できる理由は、ACID特性 という4つの特性を保証しているからです: 1. 原子性(Atomicity) 「すべてか何もか」の原則 です。トランザクション内のすべてのSQL文が成功するか、すべて失敗するかのいずれかです。 2. 一貫性(Consistency) データベースのルール(制約)が常に守られる という特性です。 3. 独立性(Isolation) 同時に実行されている複数のトランザクションが互いに干渉しない という特性です。 分離レベル(Isolation Level) 独立性のレベルは調整可能です: レベル 説明 速度 一貫性 READ UNCOMMITTED 他トランザクションの未確定データも見える 🚀 最速 ❌ 低 READ COMMITTED 確定したデータのみ見える 🟡 中速 🟡 中 REPEATABLE READ 同じデータを何度読んでも同じ結果 🐢 遅い 🟢 高 SERIALIZABLE トランザクション完全分離 🐌 最遅 ✅ 最高 4. 永続性(Durability) 一度COMMITされたデータは、障害が起きても失われない という特性です。 トランザクション実行の流れ 実装例 デッドロック 複数のトランザクションが互いにロックを待つ状況です: デッドロック回避策 トランザクションのベストプラクティス まとめ:ACID特性による信頼性 ACID特性により、データベースは 複雑で多くのユーザーが同時アクセスする環境でも、データの一貫性と安全性を保証 できます。これがリレーショナルデータベースが世界中で使われている大きな理由です。 次の章では、これらの知識を活かして、実際のパフォーマンスチューニング戦略 を学びます。