PHPカンファレンス福岡2024 【超特急】SQLアンチパターン総おさらいLT
by
y-tsuzaki
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
Copyright© M&Aクラウド 【超特急】 「SQLアンチパターン」 総おさらいLT 【5分で25個】 PHPカンファレンス福岡 2024 株式会社M&Aクラウド つざき
Slide 2
Slide 2 text
Copyright© M&Aクラウド 2 ⾃⼰紹介 つざき 経歴:Webエンジニア → データエンジニア 最近使ってる: BigQuery, MySQL, dbt, ときどきPHP 所属:株式会社 M&Aクラウド
Slide 3
Slide 3 text
Copyright© M&Aクラウド 3 PHPといえば Webアプリケーション Webアプリケーションといえば 切っては切り離せないのが データベースです
Slide 4
Slide 4 text
Copyright© M&Aクラウド 4 データベースの寿命は アプリケーションより⻑い! アンチパターンに学んで 落とし⽳にハマらないように しようじゃないか!
Slide 5
Slide 5 text
Copyright© M&Aクラウド ↑ 「SQLアンチパターン」で紹介されている 25個のアンチパターンを紹介します 5
Slide 6
Slide 6 text
Copyright© M&Aクラウド 6 知ってる⼈は復習として 知らない⼈は調べるきっかけとして ご視聴ください!
Slide 7
Slide 7 text
Copyright© M&Aクラウド 7 I部 データベース論理設計のアンチパターン 1章 ジェイウォーク(信号無視) 2章 ナイーブツリー(素朴な⽊) 3章 IDリクワイアド(とりあえずID) 4章 キーレスエントリ(外部キー嫌い) 5章 EAV(エンティティ‧アトリビュート‧バリュー) 6章 ポリモーフィック関連 7章 マルチカラムアトリビュート(複数列属性) 8章 メタデータトリブル(メタデータ⼤増殖) II部 データベース物理設計のアンチパターン 9章 ラウンディングエラー(丸め誤差) 10章 サーティワンフレーバー(31のフレーバー) 11章 ファントムファイル(幻のファイル) 12章 インデックスショットガン(闇雲インデックス) III部 クエリのアンチパターン 13章 フィア‧オブ‧ジ‧アンノウン(恐怖のunknown) 14章 アンビギュアスグループ(曖昧なグループ) 15章 ランダムセレクション 16章 プアマンズ‧サーチエンジン(貧者のサーチエンジン) 17章 スパゲッティクエリ 18章 インプリシットカラム(暗黙の列) 19章 リーダブルパスワード(読み取り可能パスワード) 20章 SQLインジェクション 21章 シュードキー‧ニートフリーク(疑似キー潔癖症) 22章 シー‧ノー‧エビル(臭いものに蓋) 23章 ディプロマティック‧イミュニティ(外交特権) 24章 マジックビーンズ(魔法の⾖) 25章 砂の城
Slide 8
Slide 8 text
Copyright© M&Aクラウド 8 I部 データベース論理設計のアンチパターン 1章 ジェイウォーク(信号無視) 2章 ナイーブツリー(素朴な⽊) 3章 IDリクワイアド(とりあえずID) 4章 キーレスエントリ(外部キー嫌い) 5章 EAV(エンティティ‧アトリビュート‧バリュー) 6章 ポリモーフィック関連 7章 マルチカラムアトリビュート(複数列属性) 8章 メタデータトリブル(メタデータ⼤増殖) II部 データベース物理設計のアンチパターン 9章 ラウンディングエラー(丸め誤差) 10章 サーティワンフレーバー(31のフレーバー) 11章 ファントムファイル(幻のファイル) 12章 インデックスショットガン(闇雲インデックス) III部 クエリのアンチパターン 13章 フィア‧オブ‧ジ‧アンノウン(恐怖のunknown) 14章 アンビギュアスグループ(曖昧なグループ) 15章 ランダムセレクション 16章 プアマンズ‧サーチエンジン(貧者のサーチエンジン) 17章 スパゲッティクエリ 18章 インプリシットカラム(暗黙の列) 19章 リーダブルパスワード(読み取り可能パスワード) 20章 SQLインジェクション 21章 シュードキー‧ニートフリーク(疑似キー潔癖症) 22章 シー‧ノー‧エビル(臭いものに蓋) 23章 ディプロマティック‧イミュニティ(外交特権) 24章 マジックビーンズ(魔法の⾖) 25章 砂の城 5分で25個!!
Slide 9
Slide 9 text
Copyright© M&Aクラウド 9 I部 データベース論理設計のアンチパターン 1章 ジェイウォーク(信号無視) 2章 ナイーブツリー(素朴な⽊) 3章 IDリクワイアド(とりあえずID) 4章 キーレスエントリ(外部キー嫌い) 5章 EAV(エンティティ‧アトリビュート‧バリュー) 6章 ポリモーフィック関連 7章 マルチカラムアトリビュート(複数列属性) 8章 メタデータトリブル(メタデータ⼤増殖) II部 データベース物理設計のアンチパターン 9章 ラウンディングエラー(丸め誤差) 10章 サーティワンフレーバー(31のフレーバー) 11章 ファントムファイル(幻のファイル) 12章 インデックスショットガン(闇雲インデックス) III部 クエリのアンチパターン 13章 フィア‧オブ‧ジ‧アンノウン(恐怖のunknown) 14章 アンビギュアスグループ(曖昧なグループ) 15章 ランダムセレクション 16章 プアマンズ‧サーチエンジン(貧者のサーチエンジン) 17章 スパゲッティクエリ 18章 インプリシットカラム(暗黙の列) 19章 リーダブルパスワード(読み取り可能パスワード) 20章 SQLインジェクション 21章 シュードキー‧ニートフリーク(疑似キー潔癖症) 22章 シー‧ノー‧エビル(臭いものに蓋) 23章 ディプロマティック‧イミュニティ(外交特権) 24章 マジックビーンズ(魔法の⾖) 25章 砂の城 1個12秒以下! 超特急でいきます
Slide 10
Slide 10 text
Copyright© M&Aクラウド 1. ジェイウォーク(信号無視) 10
Slide 11
Slide 11 text
Copyright© M&Aクラウド 11 ジェイウォーク(信号無視) ⼀つのカラムに 複数の値を⼊れるな ダメ!
Slide 12
Slide 12 text
Copyright© M&Aクラウド 2. ナイーブツリー 12
Slide 13
Slide 13 text
Copyright© M&Aクラウド 13 ナイーブツリー ツリー構造を簡単に「親ID」で 作りたくなっちゃうけど 他にも実現⽅法あるから ちゃんと検討しよう! ダメ! コメント コメント コメント コメント コメント コメント
Slide 14
Slide 14 text
Copyright© M&Aクラウド 3. IDリクワイアド(とりあえずID) 14
Slide 15
Slide 15 text
Copyright© M&Aクラウド 15 IDリクワイアド 「id」という主キーを とりあえずで作るな! できるだけ⾃然キーを使おう! ※とはいえORMの都合で id(代理キー)の⽅が便利だったりする場合もあるけど!
Slide 16
Slide 16 text
Copyright© M&Aクラウド 4. キーレスエントリ(外部キー嫌い) 16
Slide 17
Slide 17 text
Copyright© M&Aクラウド 17 キーレスエントリ(外部キー嫌い) 外部キー使え!
Slide 18
Slide 18 text
Copyright© M&Aクラウド 5. EAV (エンティティ‧アトリビュート‧バリュー) 18
Slide 19
Slide 19 text
Copyright© M&Aクラウド 19 EAV(エンティティ‧アトリビュート‧バリュー) 可変な属性を実現するために 汎⽤的な属性テーブルを作るな データを取り出すのも難しいし、整合性を保つのも難しい! サブタイプ(テーブルの継承)を使うか、どうしても必要なら JSON型などを使おう! ダメ!
Slide 20
Slide 20 text
Copyright© M&Aクラウド 6. ポリモーフィック関連 20
Slide 21
Slide 21 text
Copyright© M&Aクラウド 21 ポリモーフィック関連 タイプIDみたいなカラムで 紐付き先のテーブルを分岐するな ダメ!
Slide 22
Slide 22 text
Copyright© M&Aクラウド 22 ポリモーフィック関連 ↑抽象化したテーブル(Issues) を作るパターン👍 ↑ポリモーフィック関連を 反転させるパターン👍
Slide 23
Slide 23 text
Copyright© M&Aクラウド 7. マルチカラムアトリビュート (複数列属性) 23
Slide 24
Slide 24 text
Copyright© M&Aクラウド 24 マルチカラムアトリビュート(複数列属性) 複数の同じような列を 定義するな ダメ!
Slide 25
Slide 25 text
Copyright© M&Aクラウド 8. メタデータトリブル (メタデータ⼤増殖) 25
Slide 26
Slide 26 text
Copyright© M&Aクラウド 26 メタデータトリブル(メタデータ⼤増殖) テーブルや列をコピーすな パーティショニングしよう! ダメ!
Slide 27
Slide 27 text
Copyright© M&Aクラウド 9. ラウンディングエラー (丸め誤差) 27
Slide 28
Slide 28 text
Copyright© M&Aクラウド 28 ラウンディングエラー FLOAT型やDOUBLE型に 正確な値を求めるな
Slide 29
Slide 29 text
Copyright© M&Aクラウド 10. サーティワンフレーバー (31のフレーバー) 29
Slide 30
Slide 30 text
Copyright© M&Aクラウド 30 サーティワンフレーバー(31のフレーバー) ENUMとCHECK制約使うな 値のバリエーションが増えた時の更新が⼤変だよ
Slide 31
Slide 31 text
Copyright© M&Aクラウド 11. ファントムファイル (幻のファイル) 31
Slide 32
Slide 32 text
Copyright© M&Aクラウド 32 ファントムファイル(幻のファイル) ファイルをDBで管理するときに 実はDBに直接ファイルを⼊れちゃっ た⽅が幸せになれることもあるんだよ
Slide 33
Slide 33 text
Copyright© M&Aクラウド 12. インデックスショットガン (闇雲インデックス) 33
Slide 34
Slide 34 text
Copyright© M&Aクラウド 34 インデックスショットガン(闇雲インデックス) 闇雲にインデックス貼るな
Slide 35
Slide 35 text
Copyright© M&Aクラウド 13. フィア‧オブ‧ジ‧アンノウン (恐怖のunknown) 35
Slide 36
Slide 36 text
Copyright© M&Aクラウド 36 フィア‧オブ‧ジ‧アンノウン(恐怖のunknown) SQLのNULLは ⼀般的なプログラミング⾔語の NULLと全然違うので気をつけて
Slide 37
Slide 37 text
Copyright© M&Aクラウド 14. アンビギュアスグループ (曖昧なグループ) 37
Slide 38
Slide 38 text
Copyright© M&Aクラウド 38 アンビギュアスグループ(曖昧なグループ) GROUP BYで⾏をまとめたときに GROUP BYで指定していない カラムにアクセスすると どの⾏の値が返ってくるか 不定なのであぶねえ!
Slide 39
Slide 39 text
Copyright© M&Aクラウド 15. ランダムセレクション (あと10個🥺間に合え…!) 39
Slide 40
Slide 40 text
Copyright© M&Aクラウド 40 ランダムセレクション ランダムに1⾏取得したいときに ORDER BY RAND() LIMIT 1; やるな
Slide 41
Slide 41 text
Copyright© M&Aクラウド 16. プアマンズ‧サーチエンジン (貧者のサーチエンジン) 41
Slide 42
Slide 42 text
Copyright© M&Aクラウド 42 プアマンズ‧サーチエンジン 全⽂検索したいなら リレーショナルDBじゃなくて ⼤⼈しく全⽂検索エンジン使え
Slide 43
Slide 43 text
Copyright© M&Aクラウド 17. スパゲッティクエリ 43
Slide 44
Slide 44 text
Copyright© M&Aクラウド 44 スパゲッティクエリ 複雑すぎるSQLを書くな! 😡😡😡😡 分割統治しよう!
Slide 45
Slide 45 text
Copyright© M&Aクラウド 18. インプリシットカラム (暗黙の列) 45
Slide 46
Slide 46 text
Copyright© M&Aクラウド 46 インプリシットカラム SELECT * って書くと便利だけど どんなカラム返ってくるかわからんから めんどくさいけどカラム名指定しろ
Slide 47
Slide 47 text
Copyright© M&Aクラウド 19. リーダブルパスワード (読み取り可能パスワード) 47
Slide 48
Slide 48 text
Copyright© M&Aクラウド 48 リーダブルパスワード パスワード平⽂で格納すなw ・2024年 「約20万アカウントの情報漏えいか 平文パスワードも ペットベンチャーに不正アクセス」 ・2023年 「国 土交通省で情報漏えい ID・パスを平文保存していた ダークウェブで発見」 ・2019年 「宅ふぁいる便の平文パスワード480万件流出事件、1カ月たってもサービス再開できず」
Slide 49
Slide 49 text
Copyright© M&Aクラウド 20. SQLインジェクション 49
Slide 50
Slide 50 text
Copyright© M&Aクラウド 50 SQLインジェクション アプリケーションで 動的にSQLを組み⽴てるときは SQLインジェクション対策をしろ
Slide 51
Slide 51 text
Copyright© M&Aクラウド 21. シュードキー‧ニートフリーク (疑似キー潔癖症) 51
Slide 52
Slide 52 text
Copyright© M&Aクラウド 52 シュードキー‧ニートフリーク IDカラムの⽋番を埋めようとすなw
Slide 53
Slide 53 text
Copyright© M&Aクラウド 22. シー‧ノー‧エビル (臭いものに蓋) 53
Slide 54
Slide 54 text
Copyright© M&Aクラウド 54 シー‧ノー‧エビル アプリケーションで エラーが起こったときは 実⾏されるSQL⽂と DBからのエラーレスポンスをちゃんと⾒よ
Slide 55
Slide 55 text
Copyright© M&Aクラウド 23. ディプロマティック‧イミュニティ (外交特権) 55
Slide 56
Slide 56 text
Copyright© M&Aクラウド 56 ディプロマティック‧イミュニティ データベースも アプリケーションコードと同じように バージョン管理したりドキュメントを整備したり テストを書いたりしよう
Slide 57
Slide 57 text
Copyright© M&Aクラウド 24. マジックビーンズ (魔法の⾖) 57
Slide 58
Slide 58 text
Copyright© M&Aクラウド 58 マジックビーンズ MVCのモデルを アクティブレコードそのものにするな (アクティブレコードにいろんな責務が集まって肥⼤ 化して⼿に負えなくなる!)
Slide 59
Slide 59 text
Copyright© M&Aクラウド 25. 砂の城 (ラスト😭) 59
Slide 60
Slide 60 text
Copyright© M&Aクラウド 60 砂の城 サービスを安定稼働させるために ⾃然災害や⼈災とかシステム障害とか あらゆる想定をして万全の準備をせよ!
Slide 61
Slide 61 text
Copyright© M&Aクラウド 61 おわり!!!
Slide 62
Slide 62 text
Copyright© M&Aクラウド ↑ 気になる⽅は本を買ってね 62
Slide 63
Slide 63 text
Copyright© M&Aクラウド 63 I部 データベース論理設計のアンチパターン 1章 ジェイウォーク(信号無視) 2章 ナイーブツリー(素朴な⽊) 3章 IDリクワイアド(とりあえずID) 4章 キーレスエントリ(外部キー嫌い) 5章 EAV(エンティティ‧アトリビュート‧バリュー) 6章 ポリモーフィック関連 7章 マルチカラムアトリビュート(複数列属性) 8章 メタデータトリブル(メタデータ⼤増殖) II部 データベース物理設計のアンチパターン 9章 ラウンディングエラー(丸め誤差) 10章 サーティワンフレーバー(31のフレーバー) 11章 ファントムファイル(幻のファイル) 12章 インデックスショットガン(闇雲インデックス) III部 クエリのアンチパターン 13章 フィア‧オブ‧ジ‧アンノウン(恐怖のunknown) 14章 アンビギュアスグループ(曖昧なグループ) 15章 ランダムセレクション 16章 プアマンズ‧サーチエンジン(貧者のサーチエンジン) 17章 スパゲッティクエリ 18章 インプリシットカラム(暗黙の列) 19章 リーダブルパスワード(読み取り可能パスワード) 20章 SQLインジェクション 21章 シュードキー‧ニートフリーク(疑似キー潔癖症) 22章 シー‧ノー‧エビル(臭いものに蓋) 23章 ディプロマティック‧イミュニティ(外交特権) 24章 マジックビーンズ(魔法の⾖) 25章 砂の城 ご清聴ありがとうございました!