この記事の目次
データベースの基礎
多くのシステムで使用されるデータベースの基礎知識と目的を学びます。
データベースとは
データベースとは、データを効率的に保存・管理・検索するためのシステムです。
なぜデータベースが必要か
ファイル(Excel、テキストファイル等)でデータを管理すると、こんな問題が起きます。
| 問題 | 説明 |
|---|---|
| 同時アクセス | 複数人が同時に編集すると壊れる |
| データの整合性 | 不正なデータが入りやすい |
| 検索の効率 | 大量のデータから探すのが遅い |
| セキュリティ | アクセス制御が難しい |
| バックアップ | 復旧が難しい |
データベースは、これらの問題を解決するために設計されています。
データベースで解決できること
| 機能 | 説明 |
|---|---|
| 同時アクセス制御 | 複数人が同時に操作しても整合性を保つ |
| データの整合性 | 不正なデータを防ぐ制約を設定できる |
| 高速な検索 | インデックスで高速に検索 |
| セキュリティ | ユーザーごとにアクセス権限を設定 |
| バックアップ・復旧 | データの保護と復旧が容易 |
| トランザクション | 複数の操作をまとめて成功/失敗を保証 |
データベースの種類
リレーショナルデータベース(RDB)
最も広く使われているデータベースです。
データを「テーブル(表)」形式で管理します。
ユーザーテーブル
+----+----------+---------------------+
| id | name | email |
+----+----------+---------------------+
| 1 | 田中太郎 | tanaka@example.com |
| 2 | 山田花子 | yamada@example.com |
+----+----------+---------------------+
代表的なRDB:
| 製品 | 特徴 |
|---|---|
| MySQL | Webサービスで広く使用、オープンソース |
| PostgreSQL | 高機能、オープンソース |
| Oracle Database | 大企業で使用、商用 |
| SQL Server | Microsoft製、.NET環境で使用 |
| SQLite | ファイルベース、組み込み用途 |
操作言語:SQL(Structured Query Language)
NoSQLデータベース
RDB以外のデータベースの総称です。
| 種類 | 特徴 | 代表例 |
|---|---|---|
| ドキュメント型 | JSONのような形式でデータを保存 | MongoDB |
| キーバリュー型 | キーと値のペアでデータを保存 | Redis |
| グラフ型 | 関係性を持つデータに特化 | Neo4j |
| 列指向型 | 大量データの分析に特化 | Cassandra |
NoSQLの用途:
- 大量データの高速処理
- 柔軟なデータ構造
- 分散処理が必要な場合
ポイント:1年目はまずRDBを理解しましょう。多くの業務システムはRDBを使用しています。
データベースの構造
データベースには階層構造があります。よく混同されやすい「データベース」「スキーマ」「テーブル」の違いを理解しましょう。
データベース・スキーマ・テーブルの関係
データベースサーバー
└── データベース(Database)
└── スキーマ(Schema)
└── テーブル(Table)
├── 列(Column)
└── 行(Row)
| 用語 | 説明 | 例 |
|---|---|---|
| データベースサーバー | データベースを動かすソフトウェア | MySQL、PostgreSQL |
| データベース | データのまとまり、1つのシステム用の箱 | ECサイト用DB、社内システム用DB |
| スキーマ | テーブルをグループ化する名前空間 | public、sales、inventory |
| テーブル | 実際にデータを保存する表 | users、orders、products |
製品ごとの違い
「スキーマ」と「データベース」の扱いは製品によって異なります。
| 製品 | 特徴 |
|---|---|
| MySQL | スキーマ = データベース(同じ意味で使う) |
| PostgreSQL | データベース > スキーマ > テーブル の階層構造 |
| Oracle | スキーマ = ユーザー(ユーザーごとにスキーマを持つ) |
| SQL Server | データベース > スキーマ > テーブル の階層構造 |
ポイント:現場で「スキーマ」という言葉が出てきたら、その製品での意味を確認しましょう。
実際の例
[ECサイトのデータベース構成例]
ecsite_db(データベース)
├── public(スキーマ)
│ ├── users(テーブル)
│ ├── products(テーブル)
│ └── orders(テーブル)
└── analytics(スキーマ)
├── access_logs(テーブル)
└── sales_reports(テーブル)
リレーショナルデータベースの基本概念
テーブル(Table)
データを保存する「表」です。
注文テーブル(orders)
+----+---------+--------+------------+
| id | user_id | amount | created_at |
+----+---------+--------+------------+
| 1 | 1 | 3000 | 2024-01-01 |
| 2 | 2 | 5000 | 2024-01-02 |
| 3 | 1 | 2000 | 2024-01-03 |
+----+---------+--------+------------+
| 用語 | 説明 |
|---|---|
| 行(レコード/Row) | 1件のデータ |
| 列(カラム/Column) | データの項目(id、name など) |
| フィールド | 1つのセル(特定の行の特定の列の値) |
主キー(Primary Key)
各レコードを一意に識別するための列です。
id = 1 のユーザー → 必ず1人だけ特定できる
- 重複できない
- NULLにできない
- 通常は
idという名前の連番
外部キー(Foreign Key)
他のテーブルとの関連を示す列です。
users テーブル
+----+----------+
| id | name |
+----+----------+
| 1 | 田中太郎 |
| 2 | 山田花子 |
+----+----------+
orders テーブル
+----+---------+--------+
| id | user_id | amount |
+----+---------+--------+
| 1 | 1 | 3000 | ← user_id = 1 は「田中太郎」を指す
| 2 | 2 | 5000 |
+----+---------+--------+
↑
外部キー(usersテーブルのidを参照)
リレーション(関連)
テーブル間の関係を「リレーション」と呼びます。
| 関係の種類 | 説明 | 例 |
|---|---|---|
| 1対1 | 1件に対して1件 | ユーザーとプロフィール |
| 1対多 | 1件に対して複数件 | ユーザーと注文 |
| 多対多 | 複数件に対して複数件 | 商品とカテゴリ |
データベースの操作
CRUD
データベースの基本操作は4つです。
| 操作 | 意味 | SQL |
|---|---|---|
| Create | 作成(追加) | INSERT |
| Read | 読み取り(検索) | SELECT |
| Update | 更新 | UPDATE |
| Delete | 削除 | DELETE |
SQLとは
**SQL(Structured Query Language)**は、RDBを操作するための言語です。
-- データを取得する
SELECT * FROM users WHERE id = 1;
-- データを追加する
INSERT INTO users (name, email) VALUES ('鈴木', 'suzuki@example.com');
SQLの詳細は SQLの基礎 を参照してください。
トランザクション
トランザクションとは
複数の操作をひとまとまりとして扱う仕組みです。
なぜ必要か
例:銀行の振込処理
1. Aさんの口座から1万円を引く
2. Bさんの口座に1万円を足す
もし1の後にエラーが起きたら、Aさんのお金だけ消えてしまいます。
トランザクションを使えば:
- 両方成功する:変更が確定(コミット)
- 途中で失敗する:変更を元に戻す(ロールバック)
ACID特性
トランザクションが満たすべき4つの特性:
| 特性 | 説明 |
|---|---|
| Atomicity(原子性) | 全部成功か全部失敗のどちらか |
| Consistency(一貫性) | データの整合性が保たれる |
| Isolation(分離性) | 他のトランザクションに影響されない |
| Durability(永続性) | 確定したデータは失われない |
インデックス
インデックスとは
検索を高速化するための仕組みです。本の索引のようなものです。
インデックスなし:
全データを1件ずつ確認 → 遅い
インデックスあり:
索引から目的のデータを特定 → 速い
インデックスのトレードオフ
| メリット | デメリット |
|---|---|
| 検索が速くなる | データ追加・更新が遅くなる |
| ディスク容量を使う |
ポイント:インデックスの設計は専門的な知識が必要です。1年目は「検索を速くする仕組みがある」ことを知っておけばOKです。
データベース設計の基本
正規化
データの重複を減らす設計手法です。
悪い例(重複がある):
+----+----------+----------+--------+
| id | 商品名 | カテゴリ | 価格 |
+----+----------+----------+--------+
| 1 | りんご | 果物 | 100 |
| 2 | みかん | 果物 | 80 |
| 3 | にんじん | 野菜 | 120 |
+----+----------+----------+--------+
↑ 「果物」「野菜」が重複している
良い例(テーブルを分ける):
商品テーブル
+----+----------+-------------+--------+
| id | 商品名 | category_id | 価格 |
+----+----------+-------------+--------+
| 1 | りんご | 1 | 100 |
| 2 | みかん | 1 | 80 |
| 3 | にんじん | 2 | 120 |
+----+----------+-------------+--------+
カテゴリテーブル
+----+----------+
| id | 名前 |
+----+----------+
| 1 | 果物 |
| 2 | 野菜 |
+----+----------+
正規化のメリット:
- データの重複を減らせる
- 更新時の整合性を保ちやすい
1年目エンジニアが意識すること
まず覚えること
- テーブル・行・列の概念
- 主キーと外部キーの意味
- SQLの基本(SELECT、INSERT、UPDATE、DELETE)
- トランザクションの概念
本番データベースの注意点
- 本番環境でのUPDATE、DELETEは特に注意
- 必ずWHERE句を付ける
- 実行前にSELECTで対象を確認
- 迷ったら先輩に確認
危険なSQL
-- 危険!全レコードが削除される
DELETE FROM users;
-- 危険!全レコードが更新される
UPDATE users SET status = 'inactive';
まとめ
| 概念 | 説明 |
|---|---|
| データベース | データを効率的に管理するシステム |
| RDB | テーブル形式でデータを管理、SQLで操作 |
| テーブル | データを保存する表 |
| 主キー | レコードを一意に識別する列 |
| 外部キー | 他のテーブルとの関連を示す列 |
| トランザクション | 複数の操作をまとめて成功/失敗を保証 |
| インデックス | 検索を高速化する仕組み |
SQLの詳細は SQLの基礎 を参照してください。