自己紹介

  • とみたまさひろ
  • 得意技
    • Ruby
    • MySQL
    • 文字化け
  • 🍣🍺問題
  • 好きなO/Rマッパーは Sequel

SQLの嫌いなところ

  • 英語っぽい
  • コンピュータで扱う言語っぽくない
  • 予約語が多い
  • カラム名に「group」が使えなくて死ぬ
  • 余計な単語
  • INSERT INTO, GROUP BY

英語だからみんな騙されてるけど

日本語だったら「ぴゅう太」

みたいなもんだからな

お前の罪を数えろ

NSEG #96 (お、丸8年では?)

2018/01/27

とみたまさひろ

SQLアンチパターンを読んだ感想

「あー、あるある」

数えてみよう

ジェイウォーク

1カラムに複数の値を格納する

やったやった

「a,b,c」とするのはシロウト

「,a,b,c,」としておくと
LIKE '%,値,%' で検索できて便利

ナイーブツリー

子が親IDを参照するツリー構造

ふつーにやる

そもそもツリー構造をRDBで表現するのが負け

同じ負けなら単純な方がいい

そういえばMySQLも8から再帰クエリ書けますね

Nested Set はやりすぎ感

http://tmtms.hatenablog.com/entry/20110223/redmine

IDリクワイド

すべてのテーブルに「id」列を用いる

よくやった

userテーブルのidカラムは user.id と書けていい感じ

user.user_id はなんか冗長

全体でカラム名を一意にした方がいいような気もする

キーレスエントリ

外部キー制約を使用しない

え? MySQLをdisってんの?

初期のMySQLには外部キーなんてなかったんですよ

消す時に順番に気をつけないとエラーになるし

PostgreSQL だと何か方法あった気もする

エンティティ・アトリビュート・バリュー

汎用的な属性テーブルを使用する

名前カラムと値カラムみたいなやつ

ごめんなさい

値の型ごとにテーブルを用意する
くらいはしてもよかった

実はJSONでもいいかも

ポリモーフィック関連

二重目的の外部キーを使用する

たぶんやってない…と思う

マルチカラムアトリビュート

複数の列を定義する

tag1, tag2, tag3 カラムみたいなやつ

たぶんやってない…と思う

メタデータトリブル

テーブルや列をコピーする

行数の多いテーブルを分割するとか

諸般の事情によりやってました

つらい

ラウンディングエラー

FLOATデータ型を使用する

残念ながら使う機会がなかった

サーティワンフレーバー

限定する値を列定義で指定する

MySQLでENUM使ったり
CHECK制約で値のリストを指定したり

使ったことはある

そんなに悪くなかったような…

ファントムファイル

大きなデータをファイルで管理

やってる

ふつうやりますよね?

まあつらいこともあるけど

インデックスショットガン

闇雲にインデックスを使用する

たぶんやってない

フィア・オブ・ジ・アンノウン

col=NULL とか func(NULL) とか

ふつうはやらない

アンビギュアスグループ

非グループ化列を参照する

SELECT col1 ... GROUP BY col2 とか

やってた

たぶんMySQL以外はエラーになる

意外と便利

https://twitter.com/tmtms/status/846254316797095936

ランダムセレクション

データをランダムにソートする

自分はやらないけどそういう要求があった場合はむずかしいですね

プアマンス・サーチエンジン

LIKE '%文字列%' で全文検索

やるやる

お手軽なのでおすすめ 😇

PostgreSQLは何かの仕組みで LIKE '%文字列%' でも
インデックスを効かせることができたような

スパゲティクエリ

複雑で長いクエリ

SQL力が低くて複雑なクエリは書けません

インプリシットカラム

SELECT *

プログラム中ではふつうは書かない

手作業では使う

リーダブルパスワード

パスワードを平文で格納する

昔やりました ごめんなさい

今は平文で格納することはないけど
ハッシュ値じゃなくて復号可能な暗号にすることもある

SQLインジェクション

未検証の入力をコードとして実行する

O/Rマッパー使いましょう

シュードキー・ニートフリーク

隙間を埋める

偉い順にIPアドレスを振るみたいな?

人目に触れるものをキーとしては
つかわない方がいいですね

シー・ノー・エビル

肝心な部分を見逃す

例外機構がない言語でエラーチェックしてない

そんな人いる?

例外を隠蔽するプログラムは見たことある

ディプロマティック

イミュニティ

SQLを特別扱いする

プログラムを管理するようにはSQLを管理してない

文書化はしてない

ER図は必要になった時にツールで生成すればよくね?

Railsのマイグレーションの仕組みはすばらしい

マジックビーンズ

モデルがアクティブレコードそのもの

あるある

砂の城

想定不足

サービス継続・運用の話

運用してないからパス

結果

13 / 25

過半数 😇

おまけ

アンチパターンを考えてみた

ソーリー

ジャパニーズ・オンリー

日本語テーブル名/カラム名

英語 日本語
created_at 作成日時
user_name 利用者名

あれ?わかりやすい

文字数も少なくてすむし

入力は面倒だがエディタやIDEがきっとなんとかしてくれる

情報処理推進機構(IPA)も推奨(?)

情報処理試験データベースで日本語テーブル名と日本語カラム名のクエリを手で書かされた記憶が…

SELECT 顧客名, 会社名 FROM 顧客管理台帳
  LFET JOIN 会社管理台帳 USING 会社識別番号
  WHERE 顧客住所 ...

業務用語をそのまま使える

アンチパターン…? 🤔

実は結構よいのでは

おわり