Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

お前の罪を数えろ

492 views

Published on

NSEG #96 SQLアンチパターン読書会スペシャルで発表したスライド

Published in: Technology
  • Be the first to comment

お前の罪を数えろ

  1. 1. 自己紹介自己紹介 とみたまさひろ 得意技 Ruby MySQL 文字化け 好きなO/Rマッパーは Sequel ������������������������������������問題 1
  2. 2. SQLの嫌いなところSQLの嫌いなところ 英語っぽい コンピュータで扱う言語っぽくない 予約語が多い カラム名に「group」が使えなくて死ぬ 余計な単語 INSERT INTO, GROUP BY 2
  3. 3. 英語だからみんな騙されてるけど英語だからみんな騙されてるけど 日本語だったら「ぴゅう太」日本語だったら「ぴゅう太」 みたいなもんだからなみたいなもんだからな 3
  4. 4. お前の罪を数えろお前の罪を数えろ NSEG #96 (お、丸8年では?) 2018/01/27 とみたまさひろ 4
  5. 5. SQLアンチパターンを読んだ感想SQLアンチパターンを読んだ感想 5
  6. 6. 「あー、あるある」「あー、あるある」 6
  7. 7. 数えてみよう数えてみよう 7
  8. 8. ジェイウォークジェイウォーク 1カラムに複数の値を格納する 8
  9. 9. やったやった 「a,b,c」とするのはシロウト 「,a,b,c,」としておくと LIKE '%,値,%' で検索できて便利 9
  10. 10. ナイーブツリーナイーブツリー 子が親IDを参照するツリー構造 10
  11. 11. ふつーにやる そもそもツリー構造をRDBで表現するのが負け 同じ負けなら単純な方がいい そういえばMySQLも8から再帰クエリ書けますね Nested Set はやりすぎ感 http://tmtms.hatenablog.com/entry/20110223 /redmine 11
  12. 12. IDリクワイドIDリクワイド すべてのテーブルに「id」列を用いる 12
  13. 13. よくやった userテーブルのidカラムは user.id と書けていい感じ user.user_id はなんか冗長 全体でカラム名を一意にした方がいいような気もする 13
  14. 14. キーレスエントリキーレスエントリ 外部キー制約を使用しない 14
  15. 15. え? MySQLをdisってんの? 初期のMySQLには外部キーなんてなかったんですよ 消す時に順番に気をつけないとエラーになるし PostgreSQL だと何か方法あった気もする 15
  16. 16. エンティティ・アトリビュート・エンティティ・アトリビュート・ バリューバリュー 汎用的な属性テーブルを使用する汎用的な属性テーブルを使用する 名前カラムと値カラムみたいなやつ 16
  17. 17. ごめんなさい 値の型ごとにテーブルを用意する くらいはしてもよかった 実はJSONでもいいかも 17
  18. 18. ポリモーフィック関連ポリモーフィック関連 二重目的の外部キーを使用する二重目的の外部キーを使用する 18
  19. 19. たぶんやってない…と思う 19
  20. 20. マルチカラムアトリビュートマルチカラムアトリビュート 複数の列を定義する複数の列を定義する tag1, tag2, tag3 カラムみたいなやつ 20
  21. 21. たぶんやってない…と思う 21
  22. 22. メタデータトリブルメタデータトリブル テーブルや列をコピーするテーブルや列をコピーする 行数の多いテーブルを分割するとか 22
  23. 23. 諸般の事情によりやってました つらい 23
  24. 24. ラウンディングエラーラウンディングエラー FLOATデータ型を使用するFLOATデータ型を使用する 24
  25. 25. 残念ながら使う機会がなかった 25
  26. 26. サーティワンフレーバーサーティワンフレーバー 限定する値を列定義で指定する限定する値を列定義で指定する MySQLでENUM使ったり CHECK制約で値のリストを指定したり 26
  27. 27. 使ったことはある そんなに悪くなかったような… 27
  28. 28. ファントムファイルファントムファイル 大きなデータをファイルで管理大きなデータをファイルで管理 28
  29. 29. やってる ふつうやりますよね? まあつらいこともあるけど 29
  30. 30. インデックスショットガンインデックスショットガン 闇雲にインデックスを使用する闇雲にインデックスを使用する 30
  31. 31. たぶんやってない 31
  32. 32. フィア・オブ・ジ・アンノウンフィア・オブ・ジ・アンノウン col=NULL とか func(NULL) とかcol=NULL とか func(NULL) とか 32
  33. 33. ふつうはやらない 33
  34. 34. アンビギュアスグループアンビギュアスグループ 非グループ化列を参照する非グループ化列を参照する SELECT col1 ... GROUP BY col2 とか 34
  35. 35. やってた たぶんMySQL以外はエラーになる 意外と便利 https://twitter.com/tmtms/status /846254316797095936 35
  36. 36. ランダムセレクションランダムセレクション データをランダムにソートするデータをランダムにソートする 36
  37. 37. 自分はやらないけどそういう要求があった場合はむずか しいですね 37
  38. 38. プアマンス・サーチエンジンプアマンス・サーチエンジン LIKE '%文字列%'LIKE '%文字列%' で全文検索で全文検索 38
  39. 39. やるやる お手軽なのでおすすめ ��� PostgreSQLは何かの仕組みで LIKE '%文字列%' でも インデックスを効かせることができたような 39
  40. 40. スパゲティクエリスパゲティクエリ 複雑で長いクエリ複雑で長いクエリ 40
  41. 41. SQL力が低くて複雑なクエリは書けません 41
  42. 42. インプリシットカラムインプリシットカラム SELECT *SELECT * 42
  43. 43. プログラム中ではふつうは書かない 手作業では使う 43
  44. 44. リーダブルパスワードリーダブルパスワード パスワードを平文で格納するパスワードを平文で格納する 44
  45. 45. 昔やりました ごめんなさい 今は平文で格納することはないけど ハッシュ値じゃなくて復号可能な暗号にすることもある 45
  46. 46. SQLインジェクションSQLインジェクション 未検証の入力をコードとして実行する未検証の入力をコードとして実行する 46
  47. 47. O/Rマッパー使いましょう 47
  48. 48. シュードキー・ニートフリークシュードキー・ニートフリーク 隙間を埋める隙間を埋める 偉い順にIPアドレスを振るみたいな? 48
  49. 49. 人目に触れるものをキーとしては つかわない方がいいですね 49
  50. 50. シー・ノー・エビルシー・ノー・エビル 肝心な部分を見逃す肝心な部分を見逃す 例外機構がない言語でエラーチェックしてない 50
  51. 51. そんな人いる? 例外を隠蔽するプログラムは見たことある 51
  52. 52. ディプロマティックディプロマティック イミュニティイミュニティ SQLを特別扱いするSQLを特別扱いする プログラムを管理するようにはSQLを管理してない 52
  53. 53. 文書化はしてない ER図は必要になった時にツールで生成すればよくね? Railsのマイグレーションの仕組みはすばらしい 53
  54. 54. マジックビーンズマジックビーンズ モデルがアクティブレコードそのものモデルがアクティブレコードそのもの 54
  55. 55. あるある 55
  56. 56. 砂の城砂の城 想定不足想定不足 サービス継続・運用の話 56
  57. 57. 運用してないからパス 57
  58. 58. 結果結果 58
  59. 59. 13 / 2513 / 25 59
  60. 60. 過半数 ��� 60
  61. 61. おまけおまけ 61
  62. 62. アンチパターンを考えてみたアンチパターンを考えてみた 62
  63. 63. ソーリーソーリー ジャパニーズ・オンリージャパニーズ・オンリー 63
  64. 64. 日本語テーブル名/カラム名日本語テーブル名/カラム名 64
  65. 65. 英語 日本語 created_at 作成日時 user_name 利用者名 65
  66. 66. あれ?わかりやすいあれ?わかりやすい 66
  67. 67. 文字数も少なくてすむし文字数も少なくてすむし 67
  68. 68. 入力は面倒だがエディタやIDEが入力は面倒だがエディタやIDEが きっとなんとかしてくれるきっとなんとかしてくれる 68
  69. 69. 情報処理推進機構(IPA)も推奨(?)情報処理推進機構(IPA)も推奨(?) 情報処理試験データベースで日本語テーブル名と日本語 カラム名のクエリを手で書かされた記憶が… SELECT 顧客名, 会社名 FROM 顧客管理台帳 LFET JOIN 会社管理台帳 USING 会社識別番号 WHERE 顧客住所 ... 69
  70. 70. 業務用語をそのまま使える業務用語をそのまま使える 70
  71. 71. アンチパターン…? ������ 71
  72. 72. 実は結構よいのでは実は結構よいのでは 72
  73. 73. おわりおわり 73

×