Rのつく財団入り口

最近の本や技術系の話などを書いてます。元はTRPG系サイトの入り口でした。

【感想】SQLアンチパターン

あかんやつから学ぶDB設計とSQL回り

ITエンジニアに読んでほしい!技術書・ビジネス書大賞2017入選のオライリー本。ネット上でも書評や勉強会をよく見る定番本になりつつあるので、DBエンジニアならもう読んだ人、共感した人も多いのではないでしょうか。
 タイトルは「SQL」となっていますが実際にはDB論理設計、DB物理設計、実際のSQLクエリ、アプリケーション開発の4カテゴリに分け、計25パターンのあかんやつを説明しています。
 デザインパターンアーキテクチャパターンなど、何かのパターンを学ぶのに「こうあるべきだ」の理想から学ぶのもありですが、「こうやるとマズイよ」とアンチパターンやバッドプラクティスから、駄目な方から学ぶというのもイメージが湧いてよいですね。
 序章ではっきり専門家もミスすることを認めていたり、人の説得の仕方が書いてあったりこういう匂いがすると前兆だという話があったり、理想論ではなくかなり実務的、現場の実情に合わせた実践的な本です。
 作中の例は架空のバグ報告システムのデータベースアプリケーションを想定し、テーブル設計はすべてのこのアプリに出てきたテーブル、コード例が出てくる場合はPHPになっています。
 テーブルへのインデックスの張り方などはごく基本的なことで、高等テクニック等は出てきません。スキルのあるDBAな人など分かっている人には当たり前のようなことも出てくるのですが、その辺も含めて、系統的に分けて網羅しているところにも本書の価値があります。

SQLアンチパターン

SQLアンチパターン

www.shoeisha.co.jp

25パターンの「あかんやつ」

 アンチパターンそれぞれにこれを実現したくてやってしまったこと、見つけ方や危ない匂い、代替案や解決策、そして用いても良い場合が列挙されています。
単にダメと書いてるだけでなく根拠や問題点、回避策まできっちり繋げているところがありがたい。中には分かりづらいパターンもありますが、非常に参考になります。

 そして、アンチパターンそれぞれに名前がついてるのですが、このキャッチーな英語名がなんかかっこいい。「サーティーワンフレーバー(31のフレーバー)」とか「インデックス・ショットガン(闇雲インデックス)」とか「プアマンズ・サーチエンジン(貧者のサーチエンジン)」とか、なんかこうラノベとかの中二っぽいキャラの通り名的なカッコよさ(おい)的な、独特のセンスを感じまする。
 技術書でも海外産の本はこういう言葉選びや名言や歴史書からの引用とか、なんかこうセンスを感じるものが多いですね。
 あかんやつをパターンそれぞれに話題にしているエントリもよく見かけるので、ググってどうぞ。

 そしてネット上の反応でよく「25パターンそれぞれ名前が付けられたので勉強会の時に話題にしたり、議論したりするときに共通認識になって助かる」などを見かけます。
 まったくその通りで、DB設計でもクラス設計でも機能や画面やファイルの名前付けでも、「名前重要」というのはほんとに大事な開発の基本原則ですね。

データベースあるある

 リレーショナルデータベース(RDB)の世界はプログラミングに比べるとある意味既に収束、完成された世界で新しいパラダイムなどもあまり到来せず、安定しています。
 テーブル設計が実はあかんやつでもSQLでカバーして何とかなってしまったり、SQLが実はまずくてもパフォ―マンスで問題にならない限り埋もれて見つからずに過ぎちゃったり、システム全体としてはちゃんと動いていれば問題視されずにそのまま行っちゃうこともあります。イケてないDBやアンチパターンがこっそり中に潜んだまま実稼働して運用されていてるシステムというのは、世の中にけっこうあると思います。
 そうしたものに触れたことのあるエンジニアなら、データベースあるある本としても楽しめると思います。

 ちなみに僕はOracle全盛時代にOracle Masterの資格の勉強をし、MySQL/PostgreSQL/SQL Serverもだいたい触ってきました。DBのお守りをする立場の時もテーブル設計をする立場の時も、複雑な機能の実装で数百行のヒドいSQLを書かざるを得なかった立場の時もいろいろありましたが……このあるあるがけっこうあって辛い。(笑)
「あっ……大昔のあのプロジェクトで見たあのテーブル、やっぱりあかんやつやったんや……」「あっ……あの時のアレもやっぱりアンチパターンやったんや……」「あっ……これあの時どころかつい最近の【以下自粛】」という感じで身に染みるというか苦笑いするいうか、このなんとも言えないキモチを分かる人と分かち合える本です。

変遷するあかんやつ

 RDBは種類ごとにSQLの方言があり、流儀も多少違ったり制限があったりします。会社ごとの文化や一緒に採用する技術、時代によっても変わってくる部分があります。
 そうした意味では25アンチパターンは全て絶対禁止ではなく、場合によっては許容したり、本書にある通り採用してもよいシチュエーションや、時代の変遷によってありになるパターンもあるでしょう。よくネット上でも俺のところではこのパターンは気にしてなかった、普通にやってる……などの感想記事も見かけます。

www.slideshare.net

 本書のアンチパターンの続き的なものを作ろうという面白い記事である『この幻の第26章「とりあえず削除フラグ」』。ネット上でも許容派、否定派両方いて議論になりました。
 僕の経験から言うと論理削除フラグを全テーブルの共通項目につけたりするのはよくやるし特に困ることはなかったので、どちらか言うと許容派ですねえ。これもシステムの特性とかDB側は更新頻度やレコード量、その企業で定石とされてる文化によるところもあると思います。

 他、意見が分かれるところというと本書では第11章「ファントムファイル(幻のファイル)」にて、画像などのバイナリファイルをテーブルに入れるか、別で物理ファイルで持つかについて論じられています。本書での意見はテーブルに入れるべき、です。
 これも僕はBLOB型などのバイナリ型カラムに入れるやり方、IDやファイル名だけレコードに持ってDBの外側に実ファイルを持つやり方、両方やったことがありますが、正直どっちもどっちですね。これもシステムの各種特性を踏まえて決めるところだと思います。

 このようにデータベース回りというのは唯一の絶対正解がなく、より良い解法が実はあったとしてもシステム全体としては結局ちゃんと動いてたりするのが厄介でもあり、設計が面白いところでもあります。

おもに中級者向け、万人にお勧めできる良書

 僕が主に生息しているエンタープライズな業務システムの領域では、SQLの基本はもうみんな嗜む一般教養的なところもあり、新人はみなOracleの一番簡単な資格くらい取れ!的な感じなのですが。比較的フロント寄りに携わっている方、PHPRubyRailsなどでActive Recordパターンを駆使したフレームワークやO/Rマッパー任せで開発してる方には、DBが実はよく分からないままやっているような人も中にはいるのかなと思います。
 そういう人の理解を深めるためにも、そしてその上のSQLが分かってテーブル設計をしたりする人たちにも、とても役立つ良書です。

おまけ:RDBSQLの参考書籍

 最近の本はあまり読んでいないのもあるのですが、比較的最近発売された、特定の1つのRDBに限っていない本、よく名前を聞いたり評判の良いものを集めてみました。

多数のドリルでSQL初心者に役立つ本。

スッキリわかる SQL 入門 ドリル215問付き! (スッキリシリーズ)

スッキリわかる SQL 入門 ドリル215問付き! (スッキリシリーズ)

こちらも評価が高いですね。SQLを徹底的にレベルアップできます。

達人に学ぶ SQL徹底指南書 (CodeZine BOOKS)

達人に学ぶ SQL徹底指南書 (CodeZine BOOKS)

SQLを極限まで極めたい上級者向け。ハードル高し。

プログラマのためのSQL 第4版

プログラマのためのSQL 第4版

達人に学ぶ~シリーズの著者による、SQLのパフォーマンスに特化した本。

SQL実践入門──高速でわかりやすいクエリの書き方 (WEB+DB PRESS plus)

SQL実践入門──高速でわかりやすいクエリの書き方 (WEB+DB PRESS plus)

達人に学ぶ~のシリーズ。こちらもSQLと並んで評価が高い、DB設計の話。

達人に学ぶDB設計 徹底指南書 初級者で終わりたくないあなたへ

達人に学ぶDB設計 徹底指南書 初級者で終わりたくないあなたへ

 ブログ【漢のコンピュータ道】の著者による、RDBを徹底的に深める本。

nippondanji.blogspot.jp

 タイトル通りWeb系エンジニア向け、DBを中心とした大規模Webアプリケーション運用をターゲットに一通り網羅しています。

Webエンジニアのための データベース技術[実践]入門 (Software Design plus)

Webエンジニアのための データベース技術[実践]入門 (Software Design plus)

 こちらは読み物系。PostgreSQL、Riak、HBase、MongoDB、CouchDB、Neo4J、RedisとMySQLを除いて7つを解説、NoSQLの世界への入口にもなっています。

7つのデータベース 7つの世界

7つのデータベース 7つの世界

 僕は午後IIで落ちて一発合格は成りませんでしたが、情報処理試験のDBスペシャリストの学習をする手もあります。特定のRDBに依存しない問題で一通りRDB技術を網羅しています。
セキュリティに比べるとRDBの世界はもう完成して変化が少ないので問題の傾向もだいたい同じ、情報処理全確保支援士に比べると、比較的古い過去問でも大丈夫だと言われています。

情報処理教科書 データベーススペシャリスト 2017年版

情報処理教科書 データベーススペシャリスト 2017年版