データベース
SQL の例の多くは MySQL の sakila サンプル DB を対象にしている。 sakila のスキーマとデータは samples/sakila にある。
データベースを使う利点
データを一箇所に集約でき、常に最新のデータが分かる
データのフォーマットを統一できる
データを残すことができる
データが変わっても、一箇所変更するだけで済む
データを完全一致で速く検索できる
データを完全一致で検索する際の方法が同じ
準備
- MySQL のインストール — ローカル環境の構築、アップグレード
- 設定 — 時間、文字コード、上限、SQL モード、オートコミット
- ユーザーと権限 — 通常ユーザーとシステムユーザーの分け方
スキーマ設計
SQL
- SELECT 句 — カラム指定、エイリアス、DISTINCT、COUNT、COALESCE
- FROM 句 / JOIN — INNER JOIN する順番、OUTER JOIN をいつ使うか
- WHERE 句 — インデックス、NULL、NOT IN、EXISTS
- GROUP BY — 評価順、集計、実行時間を比較した書き方の違い
- HAVING 句 — GROUP BY の結果で絞り込む
- ORDER BY — 並べ替えとランダム
- WITH (CTE・再帰) — 一時テーブル、階層構造の展開
- 集計関数 — 複数の集計を1クエリで取る
- ウィンドウ関数 — ROW_NUMBER、LAG/LEAD、累計、ランキング
- 日付および時間関数 — 年・年月・四半期・月末の作り方
- CASE 式 — 分類して集計する
- INSERT — VALUES 指定と他テーブルからの指定
- UPDATE — 既存の値を元にする
- DELETE / TRUNCATE — 全件削除するときの違い
運用
- トランザクション — 分離レベル、ロック、デッドロック
- スキーマ変更の運用 — オンライン DDL、メタデータロック、領域要件
- ビュー — いつ使うか
- ビッグデータ — クラスタリング、シャーディング、NoSQL
- レポート — SUM の結果を行ではなく列にする
- DB と API の境界 — SQL で全部やるか API で処理するか、個人情報の扱い
横断的な話題との対応
この階層は MySQL / SQL に固有の話。製品に依存しない考え方は別の階層にある。
| この階層の記述 | 横断的な記述 |
|---|---|
| WHERE 句 ほか SQL 全般 | アプリケーションセキュリティ — パラメータ化以外は確実な対策にならない |
| ユーザーと権限 | 認証と認可 — 最小権限。アプリ用とシステム用を分ける理由 |
| 設定 | 設定の不備 — 既定値のまま本番に出さない |
| DB と API の境界 の個人情報 | 暗号と鍵の管理 — 鍵とデータを同じ DB に置かない |
| GROUP BY / インデックス の実行時間の比較 | 性能を測る — 推測せず測ってから直す。この階層の実測はその実例 |
| ビッグデータ のシャーディング | モジュール境界 / 分散システム — 分割した後に何を引き受けるか |
| トランザクション のデッドロック | インシデント対応 — まず止血し、原因の究明は後にする |
| 設定 / データ型と桁数 の文字コード | 国際化 — UTF-8 に寄せる。名前の欄を短く切らない |
データの扱いのうち、DB 製品に固有でないものは operations 側にある。
- データの完全性とリストア — レプリケーションはバックアップではない(壊れた行が全複製に押し出される)
- データ保持ポリシー — 保持期間は目的から導く。「念のため」は目的ではない