Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
PHPカンファレンス福岡2024 【超特急】SQLアンチパターン総おさらいLT
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
y-tsuzaki
June 21, 2024
Technology
1
1.5k
PHPカンファレンス福岡2024 【超特急】SQLアンチパターン総おさらいLT
PHPカンファレンス福岡2024 での登壇資料です
y-tsuzaki
June 21, 2024
Tweet
Share
More Decks by y-tsuzaki
See All by y-tsuzaki
PHPカンファレンス北海道2024 リーダブルSQL
ytsuzaki
5
810
ある日PHPerがベンチャー企業のデータ基盤を作ることになったら
ytsuzaki
1
450
【PhpStorm】モブプログラミングの実践と学び【結局はバランス?】
ytsuzaki
0
510
PHPerKaigi 2022 【Laravel】 サクッとN + 1問題を見つけて倒しチャオ!
ytsuzaki
1
3.2k
【超特急】「SQLアンチパターン」 総おさらいLT 【4分で25個】
ytsuzaki
2
900
Nuxt Composition API 使ってみた
ytsuzaki
0
270
Nuxt.js x Composition API x TypeScript
ytsuzaki
0
790
PHPerKaigi 2021 LT PHPで簡単コード生成! 同じようなコードをたくさん書くなら コード生成しチャイナ!
ytsuzaki
0
160
アクセス制御ライブラリ Casbinを使ってみた
ytsuzaki
2
1.7k
Other Decks in Technology
See All in Technology
Claude Code Skills 勉強会 (DevelersIO向けに調整済み) / claude code skills for devio
masahirokawahara
1
22k
visionOS 開発向けの MCP / Skills をつくり続けることで XR の探究と学習を最大化
karad
1
430
最強のAIエージェントを諦めたら品質が上がった話 / how quality improved after giving up on the strongest AI agent
kt2mikan
0
190
スクリプトの先へ!AIエージェントと組み合わせる モバイルE2Eテスト
error96num
0
180
ReactのdangerouslySetInnerHTMLは“dangerously”だから危険 / Security.any #09 卒業したいセキュリティLT
flatt_security
0
290
Yahoo!ショッピングのレコメンデーション・システムにおけるML実践の一例
lycorptech_jp
PRO
1
220
2026年もソフトウェアサプライチェーンのリスクに立ち向かうために / Product Security Square #3
flatt_security
1
620
システム標準化PMOから ガバメントクラウドCoEへ
techniczna
1
120
AI駆動AI普及活動 ~ 社内AI活用の「何から始めれば?」をAIで突破する
oracle4engineer
PRO
1
110
Everything Claude Code を眺める
oikon48
10
6.7k
Goのerror型がシンプルであることの恩恵について理解する
yamatai1212
1
160
Zero Data Loss Autonomous Recovery Service サービス概要
oracle4engineer
PRO
2
13k
Featured
See All Featured
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
0
180
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
130
Heart Work Chapter 1 - Part 1
lfama
PRO
5
35k
Docker and Python
trallard
47
3.8k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.5k
Navigating Team Friction
lara
192
16k
What's in a price? How to price your products and services
michaelherold
247
13k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
290
Information Architects: The Missing Link in Design Systems
soysaucechin
0
830
Speed Design
sergeychernyshev
33
1.6k
Evolving SEO for Evolving Search Engines
ryanjones
0
160
Transcript
Copyright© M&Aクラウド 【超特急】 「SQLアンチパターン」 総おさらいLT 【5分で25個】 PHPカンファレンス福岡 2024 株式会社M&Aクラウド つざき
Copyright© M&Aクラウド 2 ⾃⼰紹介 つざき 経歴:Webエンジニア → データエンジニア 最近使ってる: BigQuery,
MySQL, dbt, ときどきPHP 所属:株式会社 M&Aクラウド
Copyright© M&Aクラウド 3 PHPといえば Webアプリケーション Webアプリケーションといえば 切っては切り離せないのが データベースです
Copyright© M&Aクラウド 4 データベースの寿命は アプリケーションより⻑い! アンチパターンに学んで 落とし⽳にハマらないように しようじゃないか!
Copyright© M&Aクラウド ↑ 「SQLアンチパターン」で紹介されている 25個のアンチパターンを紹介します 5
Copyright© M&Aクラウド 6 知ってる⼈は復習として 知らない⼈は調べるきっかけとして ご視聴ください!
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章 砂の城
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個!!
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秒以下! 超特急でいきます
Copyright© M&Aクラウド 1. ジェイウォーク(信号無視) 10
Copyright© M&Aクラウド 11 ジェイウォーク(信号無視) ⼀つのカラムに 複数の値を⼊れるな ダメ!
Copyright© M&Aクラウド 2. ナイーブツリー 12
Copyright© M&Aクラウド 13 ナイーブツリー ツリー構造を簡単に「親ID」で 作りたくなっちゃうけど 他にも実現⽅法あるから ちゃんと検討しよう! ダメ! コメント
コメント コメント コメント コメント コメント
Copyright© M&Aクラウド 3. IDリクワイアド(とりあえずID) 14
Copyright© M&Aクラウド 15 IDリクワイアド 「id」という主キーを とりあえずで作るな! できるだけ⾃然キーを使おう! ※とはいえORMの都合で id(代理キー)の⽅が便利だったりする場合もあるけど!
Copyright© M&Aクラウド 4. キーレスエントリ(外部キー嫌い) 16
Copyright© M&Aクラウド 17 キーレスエントリ(外部キー嫌い) 外部キー使え!
Copyright© M&Aクラウド 5. EAV (エンティティ‧アトリビュート‧バリュー) 18
Copyright© M&Aクラウド 19 EAV(エンティティ‧アトリビュート‧バリュー) 可変な属性を実現するために 汎⽤的な属性テーブルを作るな データを取り出すのも難しいし、整合性を保つのも難しい! サブタイプ(テーブルの継承)を使うか、どうしても必要なら JSON型などを使おう! ダメ!
Copyright© M&Aクラウド 6. ポリモーフィック関連 20
Copyright© M&Aクラウド 21 ポリモーフィック関連 タイプIDみたいなカラムで 紐付き先のテーブルを分岐するな ダメ!
Copyright© M&Aクラウド 22 ポリモーフィック関連 ↑抽象化したテーブル(Issues) を作るパターン👍 ↑ポリモーフィック関連を 反転させるパターン👍
Copyright© M&Aクラウド 7. マルチカラムアトリビュート (複数列属性) 23
Copyright© M&Aクラウド 24 マルチカラムアトリビュート(複数列属性) 複数の同じような列を 定義するな ダメ!
Copyright© M&Aクラウド 8. メタデータトリブル (メタデータ⼤増殖) 25
Copyright© M&Aクラウド 26 メタデータトリブル(メタデータ⼤増殖) テーブルや列をコピーすな パーティショニングしよう! ダメ!
Copyright© M&Aクラウド 9. ラウンディングエラー (丸め誤差) 27
Copyright© M&Aクラウド 28 ラウンディングエラー FLOAT型やDOUBLE型に 正確な値を求めるな
Copyright© M&Aクラウド 10. サーティワンフレーバー (31のフレーバー) 29
Copyright© M&Aクラウド 30 サーティワンフレーバー(31のフレーバー) ENUMとCHECK制約使うな 値のバリエーションが増えた時の更新が⼤変だよ
Copyright© M&Aクラウド 11. ファントムファイル (幻のファイル) 31
Copyright© M&Aクラウド 32 ファントムファイル(幻のファイル) ファイルをDBで管理するときに 実はDBに直接ファイルを⼊れちゃっ た⽅が幸せになれることもあるんだよ
Copyright© M&Aクラウド 12. インデックスショットガン (闇雲インデックス) 33
Copyright© M&Aクラウド 34 インデックスショットガン(闇雲インデックス) 闇雲にインデックス貼るな
Copyright© M&Aクラウド 13. フィア‧オブ‧ジ‧アンノウン (恐怖のunknown) 35
Copyright© M&Aクラウド 36 フィア‧オブ‧ジ‧アンノウン(恐怖のunknown) SQLのNULLは ⼀般的なプログラミング⾔語の NULLと全然違うので気をつけて
Copyright© M&Aクラウド 14. アンビギュアスグループ (曖昧なグループ) 37
Copyright© M&Aクラウド 38 アンビギュアスグループ(曖昧なグループ) GROUP BYで⾏をまとめたときに GROUP BYで指定していない カラムにアクセスすると どの⾏の値が返ってくるか
不定なのであぶねえ!
Copyright© M&Aクラウド 15. ランダムセレクション (あと10個🥺間に合え…!) 39
Copyright© M&Aクラウド 40 ランダムセレクション ランダムに1⾏取得したいときに ORDER BY RAND() LIMIT 1;
やるな
Copyright© M&Aクラウド 16. プアマンズ‧サーチエンジン (貧者のサーチエンジン) 41
Copyright© M&Aクラウド 42 プアマンズ‧サーチエンジン 全⽂検索したいなら リレーショナルDBじゃなくて ⼤⼈しく全⽂検索エンジン使え
Copyright© M&Aクラウド 17. スパゲッティクエリ 43
Copyright© M&Aクラウド 44 スパゲッティクエリ 複雑すぎるSQLを書くな! 😡😡😡😡 分割統治しよう!
Copyright© M&Aクラウド 18. インプリシットカラム (暗黙の列) 45
Copyright© M&Aクラウド 46 インプリシットカラム SELECT * って書くと便利だけど どんなカラム返ってくるかわからんから めんどくさいけどカラム名指定しろ
Copyright© M&Aクラウド 19. リーダブルパスワード (読み取り可能パスワード) 47
Copyright© M&Aクラウド 48 リーダブルパスワード パスワード平⽂で格納すなw ・2024年 「約20万アカウントの情報漏えいか 平文パスワードも ペットベンチャーに不正アクセス」 ・2023年 「国
土交通省で情報漏えい ID・パスを平文保存していた ダークウェブで発見」 ・2019年 「宅ふぁいる便の平文パスワード480万件流出事件、1カ月たってもサービス再開できず」
Copyright© M&Aクラウド 20. SQLインジェクション 49
Copyright© M&Aクラウド 50 SQLインジェクション アプリケーションで 動的にSQLを組み⽴てるときは SQLインジェクション対策をしろ
Copyright© M&Aクラウド 21. シュードキー‧ニートフリーク (疑似キー潔癖症) 51
Copyright© M&Aクラウド 52 シュードキー‧ニートフリーク IDカラムの⽋番を埋めようとすなw
Copyright© M&Aクラウド 22. シー‧ノー‧エビル (臭いものに蓋) 53
Copyright© M&Aクラウド 54 シー‧ノー‧エビル アプリケーションで エラーが起こったときは 実⾏されるSQL⽂と DBからのエラーレスポンスをちゃんと⾒よ
Copyright© M&Aクラウド 23. ディプロマティック‧イミュニティ (外交特権) 55
Copyright© M&Aクラウド 56 ディプロマティック‧イミュニティ データベースも アプリケーションコードと同じように バージョン管理したりドキュメントを整備したり テストを書いたりしよう
Copyright© M&Aクラウド 24. マジックビーンズ (魔法の⾖) 57
Copyright© M&Aクラウド 58 マジックビーンズ MVCのモデルを アクティブレコードそのものにするな (アクティブレコードにいろんな責務が集まって肥⼤ 化して⼿に負えなくなる!)
Copyright© M&Aクラウド 25. 砂の城 (ラスト😭) 59
Copyright© M&Aクラウド 60 砂の城 サービスを安定稼働させるために ⾃然災害や⼈災とかシステム障害とか あらゆる想定をして万全の準備をせよ!
Copyright© M&Aクラウド 61 おわり!!!
Copyright© M&Aクラウド ↑ 気になる⽅は本を買ってね 62
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章 砂の城 ご清聴ありがとうございました!