🕌

読書会『SQLアンチパターン 第2版』に向けての整理

に公開

資料

サンプルコード
https://github.com/h-oura-koko/sql-anti-2nd-code

実行環境

言葉の定義

キー

  1. 出典1 - e-Words

user_id name email 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