ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
RDBMS とは
RDBMS (Relational Database Management System、リレーショナルデータベース管理システム) は、1970 年に E. F. Codd が提唱した関係モデルに基づいてデータを管理するデータベースシステムです。データを行 (Row) と列 (Column) から成るテーブル (Relation) で表現し、テーブル間の関連を外部キーで結びます。
1970 年代に IBM System R / Oracle が登場して以来 50 年以上にわたって企業システムの中核を担っており、現在も世界の構造化データの大半を保持しています。
関係モデルの基本概念
| 用語 | 意味 | SQL での呼称 |
|---|---|---|
| Relation (関係) | 属性の組合せの集合 | Table |
| Tuple (タプル) | 1 件のデータ | Row (行) / Record |
| Attribute (属性) | 項目 | Column (列) |
| Domain (定義域) | 属性の取り得る値の範囲 | Data type |
| Primary Key | レコード一意識別子 | PK |
| Foreign Key | 他テーブルの PK を参照 | FK |
ACID トランザクション
RDBMS の信頼性の根幹となる 4 つの性質:
| 性質 | 意味 |
|---|---|
| Atomicity (原子性) | 全部成功 or 全部失敗。中途半端な状態にしない |
| Consistency (一貫性) | 制約を満たす状態から状態へ移る |
| Isolation (分離性) | 並行トランザクションが互いに干渉しない |
| Durability (永続性) | COMMIT したら障害でも消えない |
分離レベル
| レベル | Dirty Read | Non-Repeatable Read | Phantom Read |
|---|---|---|---|
| READ UNCOMMITTED | ○ | ○ | ○ |
| READ COMMITTED | × | ○ | ○ |
| REPEATABLE READ | × | × | △ |
| SERIALIZABLE | × | × | × |
SQL: 4 つのカテゴリ
| 分類 | 意味 | 代表コマンド |
|---|---|---|
| DDL | Data Definition Language | CREATE / ALTER / DROP / TRUNCATE |
| DML | Data Manipulation Language | SELECT / INSERT / UPDATE / DELETE / MERGE |
| DCL | Data Control Language | GRANT / REVOKE |
| TCL | Transaction Control Language | COMMIT / ROLLBACK / SAVEPOINT |
Index (索引)
-- B-Tree インデックス (最も一般的)
CREATE INDEX idx_users_email ON users(email);
-- 複合インデックス
CREATE INDEX idx_orders_user_date ON orders(user_id, created_at DESC);
-- ユニークインデックス
CREATE UNIQUE INDEX idx_users_email ON users(email);
-- 部分インデックス (PostgreSQL)
CREATE INDEX idx_active_users ON users(email) WHERE deleted_at IS NULL;
-- カバリングインデックス
CREATE INDEX idx_orders_cover ON orders(user_id) INCLUDE (amount, status);
-- 関数インデックス
CREATE INDEX idx_users_lower_email ON users(LOWER(email));
-- 各種インデックス
-- B-Tree : 範囲検索, ソート
-- Hash : 等価検索のみ
-- GiST/GIN : 全文検索, JSON, 地理空間 (PostgreSQL)
-- BRIN : 巨大テーブル順序データ向け
制約
| 制約 | 意味 |
|---|---|
| PRIMARY KEY | 一意識別、NULL 不可 |
| UNIQUE | 一意性、NULL 可 |
| NOT NULL | NULL 不可 |
| FOREIGN KEY | 参照整合性 |
| CHECK | 条件式チェック |
| DEFAULT | 既定値 |
View (ビュー)
-- 通常のビュー (実行時に SELECT)
CREATE VIEW active_users AS
SELECT id, name, email FROM users WHERE deleted_at IS NULL;
-- マテリアライズドビュー (結果を実体化、定期リフレッシュ)
CREATE MATERIALIZED VIEW user_stats AS
SELECT user_id, COUNT(*) AS orders, SUM(amount) AS total
FROM orders GROUP BY user_id;
REFRESH MATERIALIZED VIEW user_stats;
-- 更新可能ビュー (条件を満たせば INSERT/UPDATE 可)
CREATE VIEW visible_users AS
SELECT * FROM users WHERE visibility = 'public'
WITH CHECK OPTION; -- visibility != 'public' な INSERT を拒否
Trigger (トリガー)
-- PostgreSQL
CREATE OR REPLACE FUNCTION update_modified() RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = NOW();
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER users_updated_at
BEFORE UPDATE ON users
FOR EACH ROW
EXECUTE FUNCTION update_modified();
-- MySQL
CREATE TRIGGER orders_log
AFTER INSERT ON orders
FOR EACH ROW
INSERT INTO order_log(order_id, ts) VALUES (NEW.id, NOW());
-- タイミング: BEFORE / AFTER / INSTEAD OF
-- イベント : INSERT / UPDATE / DELETE / TRUNCATE
-- 粒度 : FOR EACH ROW / FOR EACH STATEMENT
Connection Pool
DB 接続の確立は高コストなため、アプリは Connection Pool を使って接続を再利用します:
- HikariCP (Java、最速とされる)
- PgBouncer (PostgreSQL 専用、トランザクションプール)
- ProxySQL (MySQL)
- RDS Proxy (AWS マネージド)
Replication
| 方式 | 説明 |
|---|---|
| Master/Slave (Primary/Replica) | 書込はマスター、読込は両方 |
| Multi-Master | 複数マスター書込可、衝突解決必要 |
| Synchronous | 同期、データ損失ゼロ、性能影響あり |
| Asynchronous | 非同期、若干の遅延 / 損失可能性 |
| Logical Replication | SQL レベル、選択的レプリケーション |
| Physical Replication | WAL / Redo レベル、全体コピー |
Sharding (水平分割)
- Range Sharding:
user_id 1-1000 → shard1,1001-2000 → shard2 - Hash Sharding:
hash(user_id) % N - Geo Sharding: 地域で分割
- Vitess (MySQL), Citus (PostgreSQL), YugabyteDB, CockroachDB 等の自動シャーディング製品
主要 RDBMS の比較
| 製品 | ライセンス | 強み |
|---|---|---|
| Oracle Database | 商用 (高価) | 機能・性能・実績、PL/SQL |
| SQL Server | 商用 (Microsoft) | Windows との統合、T-SQL |
| DB2 | 商用 (IBM) | メインフレーム、銀行系 |
| PostgreSQL | OSS (PostgreSQL License) | 標準準拠、拡張性、JSON / 地理空間 |
| MySQL | OSS / 商用 (Oracle) | Web 系で圧倒的シェア、シンプル |
| MariaDB | OSS (Fork from MySQL) | MySQL 互換、独自エンジン (ColumnStore) |
| SQLite | OSS (Public Domain) | 組み込み、ファイルベース、世界一展開数 |
NoSQL / NewSQL との比較
| カテゴリ | 例 | 得意 | 不得意 |
|---|---|---|---|
| RDBMS | Oracle, PostgreSQL | ACID, 集計, 関連 | スキーマ柔軟性, 巨大スケール |
| Document NoSQL | MongoDB, Couchbase | 柔軟スキーマ, 開発速度 | 結合, ACID (改善中) |
| Key-Value | Redis, DynamoDB | 超高速, シンプル | 複雑クエリ |
| Column Family | Cassandra, HBase | 書込スケール, 時系列 | 結合, トランザクション |
| Graph | Neo4j | ネットワーク解析 | 大規模スループット |
| NewSQL | CockroachDB, YugabyteDB, Spanner | ACID + 分散スケール | 運用複雑, コスト |
CAP 定理
分散システムは Consistency (一貫性) / Availability (可用性) / Partition tolerance (分断耐性) の 3 つを同時に満たせない(2 つまで)。
- CA: 単一ノード RDBMS (パーティションを想定せず)
- CP: HBase, MongoDB (デフォルト), CockroachDB
- AP: Cassandra, DynamoDB, Couchbase
クラウドマネージド
| サービス | 提供元 | 対応 DB |
|---|---|---|
| Amazon RDS | AWS | MySQL, PostgreSQL, Oracle, SQL Server, MariaDB |
| Amazon Aurora | AWS | MySQL/PostgreSQL 互換、独自ストレージで高性能 |
| Cloud SQL | Google Cloud | MySQL, PostgreSQL, SQL Server |
| Azure SQL Database | Azure | SQL Server, MySQL, PostgreSQL |
| Azure Cosmos DB | Azure | マルチモデル NoSQL |
| Cloud Spanner | Google Cloud | 分散 SQL、グローバル整合性 |
Backup と Restore
- 論理バックアップ:
mysqldump,pg_dump,exp/expdp - 物理バックアップ: ファイルコピー / Snapshot
- 増分バックアップ: Redo / WAL アーカイブで差分
- PITR (Point-in-Time Recovery): 任意時刻に戻す
- RPO / RTO: 復旧時点目標 / 復旧時間目標を要件定義
FAQ
Q: RDBMS と NoSQL、どちらを選ぶべき?
A: トランザクション・複雑クエリが必要なら RDBMS、スキーマ柔軟性・水平スケールが必要なら NoSQL。両方使う「ポリグロット・パーシステンス」も一般的。
Q: PostgreSQL と MySQL、どちらが良い?
A: 標準準拠・機能豊富さなら PostgreSQL、Web シェア・シンプルさなら MySQL。新規プロジェクトは PostgreSQL が選ばれる傾向。
Q: SQL は将来も使われる?
A: 50 年使われ続けており、当面置換されません。NoSQL ですら多くが SQL 互換クエリ言語を持つようになっています (Cassandra CQL, MongoDB Aggregation など)。
Q: マネージド RDS と EC2 セルフホスト、どちらが良い?
A: 多くの場合マネージド推奨。バックアップ/パッチ/監視を AWS が代行。コスト感度が高くチームに専門家がいるならセルフホストも選択肢。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
- Oracle
- MySQL & MariaDB
- DB2
- SQLite
- PostgreSQL
- RDBMS共通
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?