SQL基礎¶
データベースを学ぶときは、まず RDB と SQL の関係を掴むと入りやすい。
RDB の基本イメージ¶
RDB は、行と列を持つテーブルでデータを管理する。
users table
+----+--------+-------------------+
| id | name | email |
+----+--------+-------------------+
| 1 | alice | a@example.com |
| 2 | bob | b@example.com |
+----+--------+-------------------+
関連するテーブルをキーでつなぐと、業務データを分割して管理しやすい。
users orders
+----+--------+ +----+---------+--------+
| id | name | | id | user_id | total |
+----+--------+ +----+---------+--------+
| 1 | alice |<---| 10 | 1 | 1200 |
| 2 | bob | | 11 | 2 | 3000 |
+----+--------+ +----+---------+--------+
SQL でよく使う操作¶
SELECTデータを取得するINSERTデータを追加するUPDATEデータを更新するDELETEデータを削除する
SELECT id, name
FROM users
WHERE id = 1;
アプリから見た基本要素¶
- テーブル
- レコード
- カラム
- 主キー
- 外部キー
- インデックス
- 制約
- トランザクション
- 正規化 / 非正規化
ACID の基本¶
RDB は更新の整合性を保ちやすく、ACID がよく出てくる。
Atomicity途中で失敗したら一連の更新をまとめて取り消すConsistency更新前後でルール違反の状態を作らないIsolation同時実行しても途中状態が見えにくいDurability完了した更新は障害後も残る
MySQL と PostgreSQL のざっくり違い¶
MySQL比較的広く使われる。Web アプリ系で触れる機会が多いPostgreSQLSQL 機能が豊富で、拡張性が高い印象
もう少し具体的な違い¶
| 観点 | MySQL | PostgreSQL |
|---|---|---|
| 印象 | Web アプリで広く使われる | 機能が豊富で拡張性が高い |
| SQL 機能 | 必要十分 | より標準寄りで高機能 |
| JSON 系 | 扱える | 扱いやすく強力な印象 |
| 拡張 | 比較的シンプル | 拡張モジュールが豊富 |
| 向いていそうな場面 | 一般的な業務アプリ | 複雑な検索、集計、拡張が必要な場面 |
厳密な優劣というより、既存システム、チームの知見、利用する機能で決まることが多い。
インデックスの基本¶
インデックスは、検索を速くするための仕組み。
- 本でいう目次のようなもの
WHEREやJOINでよく使う列に貼る- 貼りすぎると更新が重くなる
SELECT * FROM users WHERE email = 'a@example.com';
このような検索を頻繁に行うなら、email にインデックスを貼る候補になる。
トランザクションの基本¶
複数の更新をまとめて成功または失敗にしたいときに使う。
例:
- 口座Aから残高を減らす
- 口座Bへ残高を増やす
この2つが片方だけ成功すると不整合になるため、1つのトランザクションとして扱う。
学習順のメモ¶
- RDB と SQL の基本
- テーブル / 主キー / 外部キー
SELECTINSERTUPDATEDELETE- インデックス
- トランザクション
- MySQL と PostgreSQL の違い
メモ¶
- まずは
SQL が何をしているかを読める状態になるのが大事 - その後に性能や運用を見ると理解しやすい