SQLアンチパターン - 開発者を待ち受ける25の落とし穴

Preview:

DESCRIPTION

【15-B-5】SQLアンチパターン - 開発者を待ち受ける25の落とし穴 2013/02/15 デブサミ 2013

Citation preview

和田 卓人 (@t_wada)Feb 15, 2013 @ デブサミ

SQLアンチパターン

和田 卓人id: t-wada@t_wadagithub: twada

諸君は自らの経験からいくらか学ぶことができるという、全く愚かな考えであろうが、余はむしろ他人の失敗を学ぶことで、自分の失敗を回避することを好む。

─オットー・フォン・ビスマルク

Nur ein Idiot glaubt, aus den eigenen Erfahrungen zu lernen.Ich ziehe es vor, aus den Erfahrungen anderer zu lernen, um von vorneherein eigene Fehler zu vermeiden.

1. 本書の構成2. アンチパターンとは3. おわりに

Agenda

4つの部25のパターン

1. 論理設計2. 物理設計3. クエリ4. アプリケーション

1. 論理設計2. 物理設計3. クエリ4. アプリケーション

1. ジェイウォーク(信号無視)2. ナイーブツリー(素朴な木)3. IDリクワイアド(とりあえずID)4. キーレスエントリ(外部キー嫌い)5. EAV(エンティティ・アトリビュート・バリュー)6. ポリモーフィック関連7. マルチカラムアトリビュート(複数列属性)8. メタデータトリブル(メタデータ大増殖)

論理設計のアンチパターン

ざわ…ざわ…

1. 論理設計2. 物理設計3. クエリ4. アプリケーション

09. ラウンディングエラー(丸め誤差)

10. サーティワンフレーバー(31のフレーバー)

11. ファントムファイル(幻のファイル)

12. インデックスショットガン(闇雲インデックス)

物理設計のアンチパターン

否定意見多し

1. 論理設計2. 物理設計3. クエリ4. アプリケーション

13. フィア・オブ・ジ・アンノウン(恐怖のunknown)

14. アンビギュアスグループ(曖昧なグループ)

15. ランダムセレクション

16. プアマンズ・サーチエンジン(貧者のサーチエンジン)

17. スパゲッティクエリ

18. インプリシットカラム(暗黙の列)

クエリのアンチパターン

様々な解決策

1. 論理設計2. 物理設計3. クエリ4. アプリケーション

19. リーダブルパスワード(読み取り可能パスワード)

20. SQLインジェクション

21. シュードキー・ニートフリーク(疑似キー潔癖症)

22. シー・ノー・エビル(臭いものに蓋)

23. ディプロマティック・イミュニティ(外交特権)

24. マジックビーンズ(魔法の豆)

25. 砂の城 奥野さん書き下ろし!

アプリケーションのアンチパターン

1. 本書の構成2. アンチパターンとは3. おわりに

Agenda

アンチパターンとはべからず集あるある集

だけでは無い!

0. 名前1. 目的2. アンチパターン3. アンチパターンの見つけ方4. アンチパターンを用いても良い場合5. 解決策

名前重要!!

本書のアンチパターンの構成

例: ナイーブツリー(素朴な木)

パターン名が英語そのままカタカナ表記であるのは、目次を見ただけではビックリするポイントですね。

ただ、チーム内で相談するときなどに目立つ名前が付いているのはむしろありがたいですし、何よりなんかカッコよくておもしろかったです!

http://d.hatena.ne.jp/moro/20130205/1360044434

なぜカタカナ!?

「あーはいはい”インデックスショットガン”乙」Explain の結果も見ないでインデックス貼りまく

る奴いるよねーーー

「”マルチカラムアトリビュート”とか 10 年前に通ったわー」

http://yoshiori.github.com/blog/2013/02/10/sql-antipatterns/

アンチパターン名で議論できるようになる

0. 名前1. 目的2. アンチパターン3. アンチパターンの見つけ方4. アンチパターンを用いても良い場合5. 解決策

実例: ナイーブツリー(素朴な木)

目的: 階層構造を格納し、クエリを実行する

0. 名前1. 目的2. アンチパターン3. アンチパターンの見つけ方4. アンチパターンを用いても良い場合5. 解決策

実例: ナイーブツリー(素朴な木)

アンチパターンとは何でしょうか。それは、問題の解決を意図しながらも、しばしば他の問題を生じさせてしまうような技法を指します。

─ Bill Karwin

よかれと思って裏目に出てしまうもの

CREATE TABLE Comments ( comment_id SERIAL PRIMARY KEY, parent_id BIGINT UNSIGNED, comment TEXT NOT NULL,);

親idが入る

アンチパターン: 常に親のみに依存する

SELECT c1.*, c2.*, c3.*, c4.*FROM Comments c1 -- 1階層目 LEFT OUTER JOIN Comments c2 ON c2.parent_id = c1.comment_id -- 2階層目 LEFT OUTER JOIN Comments c3 ON c3.parent_id = c2.comment_id -- 3階層目 LEFT OUTER JOIN Comments c4 ON c4.parent_id = c3.comment_id -- 4階層目

アンチパターンにより起こること

素朴すぎる故にアンチパターン

0. 名前1. 目的2. アンチパターン3. アンチパターンの見つけ方4. アンチパターンを用いても良い場合5. 解決策

実例: ナイーブツリー(素朴な木)

直面している問題の種類や、メンバー間の会話での何気ない言葉が、そこにアンチパターンがあるかもしれないことに気づくヒントになります。

─ Bill Karwin

アンチパターンの見つけ方

「このツリーでは、深さを何階層までサポートすればいい?」

「ツリー型のデータ構造を扱うコードなんて二度と書きたくないな」

「ツリーの中で孤児になった行をきれいにするために、定期的にスクリプトを実行しなければ」

0. 名前1. 目的2. アンチパターン3. アンチパターンの見つけ方4. アンチパターンを用いても良い場合5. 解決策

実例: ナイーブツリー(素朴な木)

WITH CommentTree (comment_id, bug_id, parent_id, author, comment, depth)AS ( SELECT *, 0 AS depth FROM Comments WHERE parent_id IS NULL UNION ALL SELECT c.*, ct.depth+1 AS depth FROM CommentTree ct JOIN Comments c ON ct.comment_id = c.parent_id)SELECT * FROM CommentTree WHERE bug_id = 1234;

アンチパターンを用いても良い場合共通テーブル式(CTE:common table expression)

を使って再帰クエリを書ける場合

本書にはアンチパターンを適用しても良い状況の説明もあって好感が持てます。 (略) この本は単なる「べからず集」ではなく「パターン本」だからです。コンテキストや制約が異なれば導かれる解法も異なるというわけです。

アンチパターンを用いても良い場合

http://yojik.hatenablog.jp/entry/2013/02/13/235729

0. 名前1. 目的2. アンチパターン3. アンチパターンの見つけ方4. アンチパターンを用いても良い場合5. 解決策

実例: ナイーブツリー(素朴な木)

解決策: 代替ツリーモデルを使用する

comment_id path 発言者 コメント

1 1/ Fran このバグの原因は何かな?

2 1/2/ Ollie ヌルポインターのせいじゃないかな?

3 1/2/3/ Fran そうじゃないよ。それは確認済みだ。

4 1/4/ Kukla 無効なインプットを調べてみたら?

5 1/4/5/ Ollie そうか、バグの原因はそれだな。

6 1/4/6/ Franよし、じゃあチェック機能を追加して

もらえるかな?

7 1/4/6/7/ Kukla 了解。修正したよ。

策1: 経路列挙 (Path Enumeration)

2. 入れ子集合NestedSet

3. 閉包テーブルClosure Table

解決策: 代替ツリーモデルを使用する

設計 テーブル数

子へのクエリ実行

ツリーへのクエリ実行 挿入 削除 参照整合性

維持

隣接リスト 1 簡単 難しい 簡単 簡単 可能

再帰クエリ 1 簡単 簡単 簡単 簡単 可能

経路列挙 1 簡単 簡単 簡単 簡単 不可

入れ子集合 1 難しい 難しい 難しい 難しい 不可

閉包テーブル 2 簡単 簡単 簡単 簡単 可能

解決策: 代替ツリーモデルを使用する

解決策の比較表

1. 本書の構成2. アンチパターンとは3. おわりに

Agenda

この本の素晴らしいところは、よく見る「悪い」方法を「悪いこと」としてまとめてくれたことです。

この問題!進研ゼミでやったところだ!

http://bleis-tift.hatenablog.com/entry/2013/02/14/SQLアンチパターン

http://yojik.hatenablog.jp/entry/2013/02/13/235729

アンチパターンを共有しよう!

SummitDevelopers

Developers Summit 2013 Action !

アンチパターンを共有しよう!

•経験した失敗に、名前、目的、アンチパターン(裏目に出た方法)、その見つけ方などを考えてみよう。

•「どうすればよかったか」を考えてみよう。

•それを共有しよう!

39

N E X T   A C T I O N !

ご清聴ありがとうございました

本書のハッシュタグは#sqlap です!

Recommended