エラノート エラノート

データベースとは?種類と基本概念を初心者向けに解説

データベース SQL NoSQL 概念解説
広告スペース (article-top)

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の基本操作を練習し、小さなアプリでデータの保存と取得を実装してみましょう。

広告スペース (article-bottom)

あわせて読みたい