データベースとは?種類と基本概念を初心者向けに解説
Webアプリやサービスの裏側では「データベース」がデータの保存と管理を担っています。ユーザー情報、投稿内容、商品データなど、あらゆるデータはデータベースに格納されています。この記事ではデータベースの基本概念を初心者向けに解説します。
データベースとは
データベース(Database、略してDB)は、大量のデータを整理して保存し、必要なときにすばやく取り出せるようにした仕組みです。
日常生活で例えると、図書館の蔵書管理システムに似ています。本のタイトル、著者、ジャンル、配置場所などが整理されており、検索すればすぐに目的の本を見つけられます。
データベースを使わずにファイルにデータを保存することもできますが、データ量が増えると以下の問題が生じます。
- 検索に時間がかかる
- 複数の人が同時にアクセスすると壊れる可能性がある
- データの整合性を保つのが難しい
- バックアップや復旧が大変
データベースはこれらの問題を解決するために設計されています。
リレーショナルデータベース(SQL)
最も広く使われているのがリレーショナルデータベース(RDB)です。データを「テーブル」と呼ばれる表形式で管理します。
テーブルの構造
usersテーブル:
+----+--------+-------------------+-----+
| id | name | email | age |
+----+--------+-------------------+-----+
| 1 | 田中 | [email protected]| 25 |
| 2 | 鈴木 | [email protected]| 30 |
| 3 | 佐藤 | [email protected] | 22 |
+----+--------+-------------------+-----+
- テーブル: データの集まり(上の例では「users」)
- 行(レコード): 1件分のデータ
- 列(カラム): データの属性(id, name, email, age)
- 主キー(Primary Key): 各行を一意に識別する列(通常はid)
SQLの基本操作
SQL(Structured Query Language)は、データベースを操作するための専用言語です。
-- データの取得(SELECT)
SELECT name, age FROM users;
-- 結果: 田中 25, 鈴木 30, 佐藤 22
-- 条件付きの取得
SELECT * FROM users WHERE age >= 25;
-- 結果: 田中(25), 鈴木(30)
-- データの追加(INSERT)
INSERT INTO users (name, email, age)
VALUES ('山田', '[email protected]', 28);
-- データの更新(UPDATE)
UPDATE users SET age = 26 WHERE name = '田中';
-- データの削除(DELETE)
DELETE FROM users WHERE id = 3;
SQLの基本は4つの操作(CRUD)で構成されます。
- Create(作成): INSERT
- Read(読み取り): SELECT
- Update(更新): UPDATE
- Delete(削除): DELETE
主なリレーショナルデータベース
- MySQL: Web開発で広く使われている。無料。
- PostgreSQL: 高機能で拡張性が高い。無料。
- SQLite: 軽量でファイルベース。小規模な用途に最適。
- Oracle Database: 大規模な企業システム向け。
リレーション(テーブル間の関連)
リレーショナルデータベースの強みは、テーブル同士を関連づけられることです。
-- usersテーブル
-- +----+--------+
-- | id | name |
-- +----+--------+
-- | 1 | 田中 |
-- | 2 | 鈴木 |
-- +----+--------+
-- postsテーブル(user_idでusersテーブルと関連)
-- +----+---------+-------------------+
-- | id | user_id | title |
-- +----+---------+-------------------+
-- | 1 | 1 | はじめての投稿 |
-- | 2 | 1 | 2回目の投稿 |
-- | 3 | 2 | 鈴木の投稿 |
-- +----+---------+-------------------+
-- JOINで関連データを結合して取得
SELECT users.name, posts.title
FROM posts
JOIN users ON posts.user_id = users.id;
-- 結果:
-- 田中 | はじめての投稿
-- 田中 | 2回目の投稿
-- 鈴木 | 鈴木の投稿
NoSQLデータベース
NoSQL(Not Only SQL)は、リレーショナルデータベースとは異なるアプローチでデータを管理するデータベースの総称です。
ドキュメント型(MongoDB)
JSONのような形式でデータを保存します。
// MongoDBのドキュメント例
{
"_id": "abc123",
"name": "田中",
"email": "[email protected]",
"age": 25,
"hobbies": ["読書", "プログラミング"],
"address": {
"city": "東京",
"zip": "100-0001"
}
}
テーブルのように固定された列構造がなく、ドキュメントごとに異なるフィールドを持てる柔軟性があります。
キーバリュー型(Redis)
シンプルな「キーと値」のペアでデータを保存します。非常に高速で、キャッシュやセッション管理によく使われます。
キー: "user:1:name" → 値: "田中"
キー: "user:1:age" → 値: "25"
キー: "session:abc" → 値: "{...セッションデータ...}"
SQLとNoSQLの使い分け
SQL(リレーショナルDB)が向いている場面:
- データの構造が明確に決まっている
- データ間の関連が複雑(JOINが必要)
- 厳密なデータ整合性が求められる
- 例: ECサイト、会計システム、予約システム
NoSQLが向いている場面:
- データの構造が柔軟に変わる
- 大量のデータを高速に処理したい
- 水平スケーリング(サーバーの追加)が必要
- 例: SNSのタイムライン、リアルタイムチャット、IoTデータ
Pythonからデータベースを使う
SQLiteの例
SQLiteはPythonに標準搭載されているため、追加インストール不要で使えます。
import sqlite3
# データベースに接続(ファイルがなければ自動作成)
conn = sqlite3.connect("myapp.db")
cursor = conn.cursor()
# テーブルの作成
cursor.execute("""
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT UNIQUE,
age INTEGER
)
""")
# データの追加
cursor.execute(
"INSERT INTO users (name, email, age) VALUES (?, ?, ?)",
("田中", "[email protected]", 25),
)
# 変更を保存
conn.commit()
# データの取得
cursor.execute("SELECT * FROM users")
rows = cursor.fetchall()
for row in rows:
print(row)
# (1, '田中', '[email protected]', 25)
# 接続を閉じる
conn.close()
?を使ったパラメータバインディングは、SQLインジェクション(セキュリティ攻撃)を防ぐために重要です。ユーザー入力を直接SQL文に埋め込んではいけません。
よくある間違いと注意点
間違い1: SQLインジェクション
# NG: ユーザー入力を直接埋め込む(危険)
name = input("名前: ")
cursor.execute(f"SELECT * FROM users WHERE name = '{name}'")
# 入力が「' OR '1'='1」だと全データが漏洩する
# OK: パラメータバインディングを使う(安全)
cursor.execute("SELECT * FROM users WHERE name = ?", (name,))
間違い2: 接続の閉じ忘れ
# OK: with文を使えば自動的に閉じられる
with sqlite3.connect("myapp.db") as conn:
cursor = conn.cursor()
cursor.execute("SELECT * FROM users")
rows = cursor.fetchall()
# ここで自動的にcloseされる
間違い3: バックアップを取っていない
データベースは定期的にバックアップを取りましょう。SQLiteの場合はデータベースファイルをコピーするだけで済みます。
データベースはWeb開発の根幹を支える技術です。まずはSQLiteでSQLの基本操作を練習し、小さなアプリでデータの保存と取得を実装してみましょう。