Slide 1

Slide 1 text

Copyright© M&Aクラウド 【超特急】 「SQLアンチパターン」 総おさらいLT 【4分で25個】 PHP Conference Japan 2021 株式会社M&Aクラウド つざき

Slide 2

Slide 2 text

Copyright© M&Aクラウド 2 PHPといえば Webアプリケーション。 Webアプリケーションといえば 切っては切り離せないのが データベースです

Slide 3

Slide 3 text

Copyright© M&Aクラウド ↑これで紹介されている 25個のアンチパターンを紹介します 3

Slide 4

Slide 4 text

Copyright© M&Aクラウド 4 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 5

Slide 5 text

Copyright© M&Aクラウド 5 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個10秒以下! 超特急でいきます

Slide 6

Slide 6 text

Copyright© M&Aクラウド 1. ジェイウォーク(信号無視) 6

Slide 7

Slide 7 text

Copyright© M&Aクラウド 7 ジェイウォーク(信号無視) 一つのカラムに 複数の値を入れるな ダメ!

Slide 8

Slide 8 text

Copyright© M&Aクラウド 2. ナイーブツリー 8

Slide 9

Slide 9 text

Copyright© M&Aクラウド 9 ナイーブツリー 親IDでツリー構造を実現するな(?) ※再帰クエリかけるDBなら問題じゃないかも?

Slide 10

Slide 10 text

Copyright© M&Aクラウド 3. IDリクワイアド(とりあえずID) 10

Slide 11

Slide 11 text

Copyright© M&Aクラウド 11 IDリクワイアド IDという主キーを とりあえずで作るな 使えたら自然キーを使え

Slide 12

Slide 12 text

Copyright© M&Aクラウド 4. キーレスエントリ(外部キー嫌い) 12

Slide 13

Slide 13 text

Copyright© M&Aクラウド 13 キーレスエントリ(外部キー嫌い) 外部キー使え

Slide 14

Slide 14 text

Copyright© M&Aクラウド 5. EAV (エンティティ・アトリビュート・バリュー) 14

Slide 15

Slide 15 text

Copyright© M&Aクラウド 15 EAV(エンティティ・アトリビュート・バリュー) 可変な属性を実現するために 汎用的な属性テーブルを作るな

Slide 16

Slide 16 text

Copyright© M&Aクラウド 6. ポリモーフィック関連 16

Slide 17

Slide 17 text

Copyright© M&Aクラウド 17 ポリモーフィック関連 親タイプみたいなカラムで 従属テーブルを分岐するな バグ 改善提案 1 1 多 コメント CREATE TABLE Comments ( comment_id INT UNSIGNED NOT NULL PRIMARY KEY, issue_type VARCHAR(100) NOT NULL, issue_id INT UNSIGNED NOT NULL, ) 説明むずいから本読んで><

Slide 18

Slide 18 text

Copyright© M&Aクラウド 7. マルチカラムアトリビュート(複数列属性) 18

Slide 19

Slide 19 text

Copyright© M&Aクラウド 19 マルチカラムアトリビュート(複数列属性) 複数の同じような列を 定義するな ダメ!

Slide 20

Slide 20 text

Copyright© M&Aクラウド 8. メタデータトリブル(メタデータ大増殖) 20

Slide 21

Slide 21 text

Copyright© M&Aクラウド 21 メタデータトリブル(メタデータ大増殖) テーブルや列をコピーすな ダメ!

Slide 22

Slide 22 text

Copyright© M&Aクラウド 9. ラウンディングエラー(丸め誤差) 22

Slide 23

Slide 23 text

Copyright© M&Aクラウド 23 ラウンディングエラー FLOATやDOUBLE型に 正確な値を求めるな

Slide 24

Slide 24 text

Copyright© M&Aクラウド 10. サーティワンフレーバー(31のフレーバー) 24

Slide 25

Slide 25 text

Copyright© M&Aクラウド 25 サーティワンフレーバー( 31のフレーバー) ENUMとCHECK制約使うな

Slide 26

Slide 26 text

Copyright© M&Aクラウド 11. ファントムファイル(幻のファイル) 26

Slide 27

Slide 27 text

Copyright© M&Aクラウド 27 ファントムファイル(幻のファイル) ファイルをDBで管理するときに ファイルパスをDBに格納して 物理ファイルをDB外で扱うのは 必ずしも必須ちゃうで

Slide 28

Slide 28 text

Copyright© M&Aクラウド 12. インデックスショットガン (闇雲インデックス) 28

Slide 29

Slide 29 text

Copyright© M&Aクラウド 29 インデックスショットガン(闇雲インデックス) 闇雲にインデックス貼るな

Slide 30

Slide 30 text

Copyright© M&Aクラウド 13. フィア・オブ・ジ・アンノウン (恐怖のunknown) 30

Slide 31

Slide 31 text

Copyright© M&Aクラウド 31 フィア・オブ・ジ・アンノウン(恐怖の unknown) SQLのNULLを 一般的なプログラミング言語のNULL と同じように扱うな

Slide 32

Slide 32 text

Copyright© M&Aクラウド 14. アンビギュアスグループ(曖昧なグループ) 32

Slide 33

Slide 33 text

Copyright© M&Aクラウド 33 アンビギュアスグループ(曖昧なグループ) GROUP BYで行をまとめたときに GROUP BYで指定していない カラムにアクセスすると どの行の値が返ってくるか 不定なのでやめれ

Slide 34

Slide 34 text

Copyright© M&Aクラウド 15. ランダムセレクション (あと10個🥺間に合え…!) 34

Slide 35

Slide 35 text

Copyright© M&Aクラウド 35 ランダムセレクション ランダムに1行取得したいときに ORDER BY RAND() LIMIT 1; やるな

Slide 36

Slide 36 text

Copyright© M&Aクラウド 16. プアマンズ・サーチエンジン (貧者のサーチエンジン) 36

Slide 37

Slide 37 text

Copyright© M&Aクラウド 37 プアマンズ・サーチエンジン 全文検索したいなら リレーショナルDBじゃなくて 大人しく全文検索エンジン使え

Slide 38

Slide 38 text

Copyright© M&Aクラウド 17. スパゲッティクエリ 38

Slide 39

Slide 39 text

Copyright© M&Aクラウド 39 スパゲッティクエリ ドヤ顔でクソムズSQL書くな! 😡😡😡😡

Slide 40

Slide 40 text

Copyright© M&Aクラウド 18. インプリシットカラム(暗黙の列) 40

Slide 41

Slide 41 text

Copyright© M&Aクラウド 41 インプリシットカラム SELECT * って書くと便利だけど どんなカラム返ってくるかわからんから めんどくさいけどカラム名指定しろ

Slide 42

Slide 42 text

Copyright© M&Aクラウド 19. リーダブルパスワード (読み取り可能パスワード) 42

Slide 43

Slide 43 text

Copyright© M&Aクラウド 43 リーダブルパスワード パスワード平文で格納すなw

Slide 44

Slide 44 text

Copyright© M&Aクラウド 20. SQLインジェクション 44

Slide 45

Slide 45 text

Copyright© M&Aクラウド 45 SQLインジェクション アプリケーションで 動的にSQLを組み立てるときは SQLインジェクション対策をしろ

Slide 46

Slide 46 text

Copyright© M&Aクラウド 21. シュードキー・ニートフリーク (疑似キー潔癖症) 46

Slide 47

Slide 47 text

Copyright© M&Aクラウド 47 シュードキー・ニートフリーク IDカラムの欠番を埋めようとすなw

Slide 48

Slide 48 text

Copyright© M&Aクラウド 22. シー・ノー・エビル(臭いものに蓋) 48

Slide 49

Slide 49 text

Copyright© M&Aクラウド 49 シー・ノー・エビル アプリケーションで エラーが起こったときは 実行されるSQL文と DBからのエラーレスポンスをちゃんと見よ

Slide 50

Slide 50 text

Copyright© M&Aクラウド 23. ディプロマティック・イミュニティ (外交特権) 50

Slide 51

Slide 51 text

Copyright© M&Aクラウド 51 ディプロマティック・イミュニティ データベースコードも アプリケーションコードと同じように バージョン管理したりドキュメントを整備せよ

Slide 52

Slide 52 text

Copyright© M&Aクラウド 24. マジックビーンズ(魔法の豆) 52

Slide 53

Slide 53 text

Copyright© M&Aクラウド 53 マジックビーンズ MVCのモデルを アクティブレコードそのものにするな

Slide 54

Slide 54 text

Copyright© M&Aクラウド 25. 砂の城 (ラスト😭) 54

Slide 55

Slide 55 text

Copyright© M&Aクラウド 55 砂の城 サービスを安定稼働させるために 自動化やマニュアル整備など 万全の準備をせよ

Slide 56

Slide 56 text

Copyright© M&Aクラウド 56 おわり!!!😂

Slide 57

Slide 57 text

Copyright© M&Aクラウド ↑ 気になる方は本を買ってね 57