2013/5/11 DevLOVE関西「SQLアンチパターン・レトロスペクティブ関西・リターン 」に参加

2013/5/11(土)の13:00より、DevLOVE関西「SQLアンチパターン・レトロスペクティブ関西・リターン 」が楽天さんのカフェテリアで実施するというのをたまたま4月末に発見し、思い切って参加してきました。

SQLアンチパターンの本はそれより前に購入していて、内容を読んでてこりゃほとんどが該当するやん、と感じていましたが、それ以上の発展がなかったので今回をきっかけにより知識を習熟させたかったのが動機です。

SQLアンチパターン

SQLアンチパターン

この日は見事に雨。
まあ四つ橋線肥後橋駅からはかなり近いので、それほど困りませんでした。


会場に到着すると、参加証とA4両面にアンチパターンと簡単な説明が記載されたものを頂きました。

正直、アンチパターンを完全に覚えておけば、たとえ忘れてもこの紙さえ見れば思い出せるような紙でした。

本編

この日は和田さんが2名(和田卓人さん、和田省二さん)。そう、親子でお越しでした。
これまたラッキー。

この日は、最初はスライドを使ってのレクチャー形式、その後はグループディスカッション形式という流れでした。

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

スライドとSQLアンチパターンの内容を元に、和田卓人さんにレクチャーしていただきました。

1部 論理設計
 1.ジェイウォーク (信号無視)
 2.ナイーブツリー (素朴な木)
 3.IDリクワイアド (とりあえずID)
 4.キーレスエントリ (外部キー嫌い)
 5.EAV (エンティティ・アトリビュート・バリュー)
 6.ポリモーフィック関連
 7.マルチカラムアトリビュート (複数列属性)
 8.メタデータトリブル (メタデータ大増幅)
2部 物理設計
 9.ラウンディングエラー (丸め誤差)
 10.サーティワンフレーバー (31のフレーバー)
 11.ファントムファイル (幻のファイル)
 12.インデックスショットガン (闇雲インデックス)
3部 クエリー
 13.フィア・オブ・ジ・アンノウン (恐怖のunknown)
 14.アンビギュアスグループ (曖昧なグループ)
 15.ランダムセレクション
 16.プアマンズ・サーチエンジン (貧者のサーチエンジン
 17.スパゲティクエリ
 18.インプリショットカラム (暗黙の列)
4部 アプリケーション
 19.リーダブルパスワード (読み取り可能パスワード)
 20.SQLインジェクション
 21.シュードキー・ニートフレーク (擬似キー潔癖症)
 22.シー・ノー・エビル (臭いものには蓋)
 23.ディプロマティック・イミュニティ (外交特権)
 24.マジックビーンズ (魔法の豆)
 25.砂の城
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)

アンチパターンの内容はあらかじめ本を読んでいたので理解に困ることはありませんでしたが、内容を改めて認識することができました。
また印象に残ったこととして、アンチパターンの構成とネーミングがありました。

デザインパターンでもそうですが、「○○パターン」の命は名前。(しかもカタカナで)
インデックスショットガンなんて、印象に残りまくりです。
なので何かパターンを作るときは名前をしっかり考えないと周りに定着しない、そんなお話でした。

SQLアンチパターン・レトロスペクティブ

この時間は現場の経験談、失敗談を話し合い、各チームがそれを発表するという形式でした。

うちのチームでは一通り見てこれもあるよね、あれもあるよねという話になりましたが、その中でもキーレスエントリ(外部キー嫌い)で盛り上がりました。
理論的にある方がデータ構造が崩れないとはわかっているのですが、当初の設計思想から入ってなかったり、細かい業務フローの要求に答えていく中で外部キー参照が無くなる、など。

あと、テストをするときにわざわざ関係ないものでもそれを参照している全データを作る必要があり不便、という話も出ました。
今思えばそれは単に開発者がラクをしたいだけなのかもしれませんが。
ユニットテストで外部キー参照のテストをしないわけにはいかないでしょう、と少し時間がたった今、客観的に思うところがあります。


他のチームを含め、比較的アプリ寄りのアンチパターンがよく出ました。
自分は最近は基幹系ということだからか、もしくはたまたまそういうSQLが多いからかわかりませんが、論理設計のアンチパターンだけでもお腹がいっぱいです。
あとは物理設計のインデックスショットガンでしょうか。
最近はショットガンが逆になさすぎて悩まされることが多いですが。。(要はインデックスがデータ量の割にあまり張られていない)

26個目の落とし穴を探せ

今回のSQLアンチパターンには25個のパターンが記載されていましたが、では26個目を各チーム議論して出してみましょうという時間でした。
自分のチームは3名の構成だったのですが、自分自身講義の中で1つのアンチパターンを思い浮かべてたのでそれを説明しました。


アンチパターン名は「Deadbeat Datetime (時間に疲弊)
テーブル定義での日付型とアプリケーションでの日付処理に悩んだことはないでしょうか。
 ・DATE型で定義したのに時分秒がシステム導入当初は入っていたが、途中の改修より入らなくなった
 ・誕生日のカラムはDATE型?varchar(8)?varchar(10)?varchar(6)?number(8)?number(20)?timestamp型?
 ・between等での日付の検索を考慮してる?
 ・手動更新する場合はしっかりルール決めしている?


個人的に非常によく悩む問題だったのでとりあげさせてもらいました。
#納得してもらえたかな〜(´Д`)


その他にも「メタデータトランスフォーマー」や「とりあえずDB」といったユニークなアンチパターンが次々と発表され、ふむふむとうなずく時間でした。

大質問大会 (の予定でしたが・・・)

さて、何を質問しようと考えていたのですが、先ほどの26個目のアンチパターンのコメントをしていただく流れに自然となりました。
そしてそこから、和田省二さんがホワイトボードを使っての講義に発展!
ものすごく勉強になりました。
(リソースとイベントのお話)

この会を終えて

本を買うことは昔からやっていましたが、著者から実際に話しを聞く機会はこれまでなかったと記憶しています。
やはり読むだけでは理解していない、話を聞いたりそれについて議論しあうほうが、より頭に残る(印象に残る)ことを実感しました。

最後に、今回初めてのDevLOVE関西への参加でしたが、会場提供いただいた楽天様、和田卓人様、和田省二様、DevLOVE関西の関係者の皆様、ありがとうございました。

懇親会

終了後は懇親会へ。
13名参加ということで、参加人数から見ればかなり高い割合。
場所は北新地。

気がつけば終電近くまで飲んで話してました。
同じような考え方や職種の人が集まるとここまでおもろいのかというのを実感。
技術系の話でワイワイすることってなかなかありませんからね〜。

本当に楽しい時間を過ごさせてもらいました。


DevLOVEの細かいことはDoorkeeperをご参照下さい。
DevLOVE関西「SQLアンチパターン・レトロスペクティブ関西・リターン 」 - DevLOVE関西