この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:5
ページ更新者:atom
更新日時:2026-06-11 07:10:02

タイトル: データベース関連
SEOタイトル: データベース関連用語・基礎概念完全ガイド (RDBMS/NoSQL/ACID)

この記事の要点
  • RDBMS: MySQL / PostgreSQL / Oracle / SQL Server / SQLite / MariaDB
  • NoSQL: MongoDB(ドキュメント) / Redis(KVS) / Cassandra / DynamoDB
  • NewSQL: CockroachDB / TiDB(分散だが SQL と ACID を両立)
  • ACID(Atomicity / Consistency / Isolation / Durability)とトランザクション
  • 正規化(第1〜第3 正規形)、インデックスForeign KeyER 図ORM

データベースの大分類

分類代表製品得意苦手
RDBMSMySQL / PostgreSQL / Oracle / SQL Server整合性・複雑クエリ・JOIN水平スケール
KVSRedis / Memcached / DynamoDB高速・キャッシュ複雑クエリ
ドキュメントMongoDB / Couchbaseスキーマレス・JSON 自然JOIN・トランザクション
カラム指向Cassandra / HBase / ClickHouse大量書き込み・分析個別行参照
グラフNeo4j / Amazon Neptune関係探索・推薦大量バルク処理
時系列InfluxDB / TimescaleDB計測データ・IoT汎用 OLTP
NewSQLCockroachDB / TiDB / Spanner水平スケール + ACID運用ノウハウ未成熟
全文検索Elasticsearch / OpenSearch / Solrあいまい検索・スコアリング更新の即時性

主要 RDBMS の特徴

製品ライセンス特徴主な用途
MySQLGPL + Oracle 商用軽量・採用実績豊富Web アプリ全般
MariaDBGPLMySQL フォーク、互換性高OSS 志向の Web
PostgreSQLPostgreSQL ライセンスSQL 標準準拠・拡張機能豊富 (PostGIS, pg_trgm)分析系・GIS・複雑要件
Oracle Database商用最高性能・大規模本番運用金融・基幹システム
SQL Server商用Windows と密接連携 (T-SQL)Windows 系業務
SQLiteパブリックドメインファイル DB・組み込みモバイル・テスト・小規模

ACID とトランザクション

ACID は RDBMS が満たす 4 つの性質です:

性質意味
Atomicity(原子性)全実行か全取消か振込で片方だけ反映されない
Consistency(整合性)制約を常に満たすFK 違反は commit させない
Isolation(隔離性)同時実行が直列実行と同じダーティリードを防ぐ
Durability(耐久性)commit 後は失われないクラッシュ後も復旧可能
-- トランザクションの基本
BEGIN;  -- または START TRANSACTION

UPDATE accounts SET balance = balance - 1000 WHERE id = 1;
UPDATE accounts SET balance = balance + 1000 WHERE id = 2;

-- すべて成功したら確定
COMMIT;

-- 途中でエラーなら取り消し
ROLLBACK;

-- 分離レベル
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;     -- PG/Oracle 既定
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;    -- MySQL InnoDB 既定
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;       -- 最高、ロック競合増

正規化(Normal Form)

正規形条件違反例
第 1 正規形 (1NF)1 セル 1 値(繰り返しグループ無し)tags = "PHP,Laravel,MySQL"
第 2 正規形 (2NF)1NF + 部分関数従属を排除複合キーの一部にだけ依存する列
第 3 正規形 (3NF)2NF + 推移的関数従属を排除user_id → dept_id → dept_name の dept_name 持ち込み
BCNF / 4NF / 5NFより厳格な分解実務ではあまり意識しない

実務では「3NF を基本としつつ、検索が遅い部分は意図的に非正規化」がセオリーです。

インデックスと外部キー

-- 主キー(自動的にユニークインデックスが作られる)
CREATE TABLE users (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    email VARCHAR(255) NOT NULL UNIQUE,    -- UNIQUE インデックス
    name VARCHAR(100) NOT NULL,
    created_at DATETIME NOT NULL
);

-- 通常インデックス
CREATE INDEX idx_users_created_at ON users (created_at);

-- 複合インデックス(先頭列から左寄せで使われる)
CREATE INDEX idx_orders_user_status ON orders (user_id, status);

-- 部分インデックス(PostgreSQL)
CREATE INDEX idx_orders_active ON orders (created_at) WHERE status = 'active';

-- 外部キー制約
CREATE TABLE orders (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    user_id BIGINT NOT NULL,
    amount INT,
    FOREIGN KEY (user_id) REFERENCES users(id)
        ON DELETE CASCADE
        ON UPDATE CASCADE
);

レプリケーションとシャーディング

手法目的仕組み
主従レプリケーション読み取り負荷分散・冗長化書きは Primary、読みは Replica
マルチマスター書き込みも分散競合解決が必要 (Galera, BDR)
シャーディング巨大データの水平分割ユーザー ID 等でハッシュ分散
パーティショニング巨大テーブル内分割日付や ID で分割 (RANGE/HASH/LIST)
Read Replicaクラウドの非同期 ReplicaRDS / Cloud SQL の機能

NoSQL の概要

// MongoDB(ドキュメント型)
db.users.insertOne({
  name: "taro",
  age: 30,
  tags: ["php", "laravel"],
  address: { city: "Tokyo", zip: "100-0001" }
});
db.users.find({ age: { $gte: 18 }, "address.city": "Tokyo" });

// Redis(KVS)
SET user:1:name "taro"
EXPIRE user:1:name 3600
LPUSH queue:emails "user@example.com"
HSET user:1 name "taro" age 30
ZADD leaderboard 1500 "alice" 1800 "bob"

ORM(Object-Relational Mapping)

言語代表 ORM
PHPEloquent (Laravel) / Doctrine (Symfony)
JavaHibernate / JPA / MyBatis
PythonSQLAlchemy / Django ORM
Node.jsPrisma / TypeORM / Sequelize
RubyActiveRecord (Rails)
GoGORM / sqlc / ent
C#Entity Framework Core

ER 図(Entity Relationship Diagram)

テーブル間の関係を可視化する図。1:1 / 1:N / N:M を矢印で表現します。

  • 1:1 — ユーザー ↔ プロフィール
  • 1:N — ユーザー → 注文(一人が複数注文)
  • N:M — 学生 ↔ 科目(中間テーブルが必要)

用途別 DB 選定の目安

用途推奨
Web アプリ全般MySQL / PostgreSQL
キャッシュ・セッションRedis
大量ログ・イベントElasticsearch / ClickHouse
IoT 計測データInfluxDB / TimescaleDB
金融基幹Oracle / SQL Server
サーバーレス・低運用DynamoDB / Firestore
分析・BIBigQuery / Snowflake / Redshift

FAQ

Q: MySQL と PostgreSQL、どちらを選べばいい?
A: シンプル & レプリケーション豊富なら MySQL、複雑クエリ & 拡張機能 (PostGIS, JSONB) なら PostgreSQL。新規案件は PostgreSQL の採用が増えています。

Q: NoSQL を採用すべきタイミングは?
A: スキーマが頻繁に変わる、JOIN が不要、水平スケールが必須、のいずれかが当てはまるとき。大抵の Web アプリは RDBMS + Redis で十分です。

Q: ORM と生 SQL、どう使い分ける?
A: 基本は ORM、大量データ集計など性能クリティカルな箇所だけ生 SQL。混在は普通の構成です。