Upgrade to Pro — share decks privately, control downloads, hide ads and more …

【超特急】「SQLアンチパターン」 総おさらいLT 【4分で25個】

y-tsuzaki
October 03, 2021

【超特急】「SQLアンチパターン」 総おさらいLT 【4分で25個】

【超特急】「SQLアンチパターン」 総おさらいLT 【4分で25個】

PHP Conference Japan 2021
株式会社M&Aクラウド つざき

y-tsuzaki

October 03, 2021
Tweet

More Decks by y-tsuzaki

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

  4. 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章 砂の城

    View Slide

  5. 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秒以下!
    超特急でいきます

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  17. 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,
    )
    説明むずいから本読んで><

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide