🕌
読書会『SQLアンチパターン 第2版』に向けての整理
資料
サンプルコード
実行環境
言葉の定義
キー
| user_id | name | created_at | |
|---|---|---|---|
| 001 | 山田 太郎 | taro.y@example.com | 2024/01/15 |
| 002 | 佐藤 花子 | hanako.s@example.jp | 2024/03/28 |
| 003 | 田中 健太 | kenta.t@test.net | 2024/05/01 |
| 004 | 鈴木 美咲 | misaki.s@sample.com | 2024/07/10 |
- 候補キー
- テーブルの行を一意に識別できる列の組み合わせのこと. 単体のこともある。主キーの候補
- 候補キーは、それ自身が最小のスーパーキーである。
-
{user_id},{email}, ... など
- 主キー
- そのテーブルの行を一意に定めるための候補キー
-
{user_id}など
- 代替キー
- 主キーとして選ばれなかった候補キー
-
{email}など
- 複合キー
- 主キーが複数の属性で構成されている場合の呼称
- スーパーキー
- 候補キーの組み合わせに加えて、他の属性を含めたもの
- 候補キーを包含する関係性
- サロゲートキー(擬似キー, 代理キー)
- 主キーとして取り扱うために人工的に足されたキーのこと。
集合論
- モノを1つにまとめたものを集合と呼ぶ
- (データベースの文脈で) {Column} は Column 属性をもつ集合を意味する
{user_id} := {001, 002, 003, 004}
-
X -> Y := Y は X に関数従属する、という- X の項目が定まれば一意に Y の項目が定まる関係
- X を独立属性, Y を従属属性 という
- 部分関数従属 := 候補キーの一部に関数従属している関係のこと
- 出典3 に例記載
- 完全関数従属 := 候補キーの全てに対して関数従属している関係のこと
- 出典3 に例記載
- 推移的関数従属 := X->Y, Y->Z が両立している状態. X->Z の関係のこと
- 出典3 に例記載
正規形
第一正規形(1NF)
感覚的定義
- 1つのセルでは1つのことしか表現されていない
- 同じ内容が複数のカラムで表現されていない
❌ NG 例
| userId | name | hobby1 | hobby2 | hobby3 |
|---|---|---|---|---|
| 1 | Jack | 登山 | 楽器演奏 | 料理 |
| 2 | John | 料理 | null | null |
❌ NG 例
| userId | name | hobby |
|---|---|---|
| 1 | Jack | 登山,楽器演奏,料理 |
| 2 | John | 料理 |
🙆 OK 例
| userId | name | hobby |
|---|---|---|
| 1 | Jack | 登山 |
| 1 | Jack | 楽器演奏 |
| 1 | Jack | 料理 |
| 2 | John | 料理 |
第二正規形(2NF)
感覚的定義
- 独立属性の定義が正しい状態
- 主キーの属性として過不足なく定義されている状態
数学的定義
- 1NFを満たし、すべての候補キーに対して部分関数従属を排除した状態
第三正規形(3NF)
感覚的定義
- 推論可能な属性が排除されている状態
数学的定義
- 2NFを満たし、すべての候補キーに対して推移的関数従属を排除した状態
その他正規形
- ボイス・コッド正規形
- すべての関数従属性 X -> Y において、決定項 X がスーパーキーであること
- 第4正規形
- 1つのテーブルで 3つ 以上のテーブルが関わる交差テーブルが存在しないこと
- 第5正規形
- 1つのテーブルで3すくみの関係をもつ3つの属性が存在しないこと(雑)
Discussion