ボクココ

サービス開発を成功させるまでの歩み

プログラマのための SQL を読んで

ども、@kimihom です。

今回は以下の本をざっと読んだので感想を書く。760ページにもなる超大型本だ。

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

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

SQL でここまでできる

私は普段、Web アプリケーションのコードを書くエンジニアなのでデータベースの知識はそこまで深くない。よりデータベースの知識を深めようということで本書を手に取った。

本書の前半部分は SQL の一般的な教養的な感じで学ぶことができた。いきなりトランザクションの話が出てきたときはマジかよって思ったけど、そのあとは SQL の各句の詳細な解説などもあった。

一番ここで感じたのは、「NULL の扱いの難しさ」だったように思う。NULL は SQL の中で本当に特異的な存在で、実際にクエリを書くときも注意しないと意図しない結果を生むことにもなりかねない。本書でにおける NULL を扱うことで意図しない結果を生んでしまう SQL の例がたくさんあったので、やはりテーブル作る時に NOT NULL にして初期値をセットするのは大事だなと改めて感じた次第である。 例え NULL を許容するカラムがあったとしても、COALESCENULLIF などを使って丁寧なクエリを書くことを意識したい。普段 Rails を使っていると ActiveRecord で隠蔽されちゃうけども、何か困った時にはちゃんと自前でしっかりとした SQL を組み立てられるようにならないといけない。

本書の後半部分では SQL を駆使したテクニック的な側面が強かった。SQL も1つの立派なプログラミング言語であるので、複雑な問題を SQL “だけで” 解くことができたりする。当然それはそれで SQL を極めるって意味では本書の意図に適っており、学ぶことはあった。しかし、実際にそれを解くってなるとやはり私は Ruby や JavaScript などのプログラミング言語で解きたいなと思う。

グラフや木構造を SQL で扱う話もあった。当然、SQL はそのような設計で作られてはいないので、トリッキーな構造でテーブルとして管理する必要がある。でも実際 SQL でこういうデータ構造を扱うことってどのくらいあるのかと疑問に思った。最近では Neo4j などのグラフ志向データベースなどが出てきているので、適材適所なんじゃないかなと思った。そういう意味では後半はちょっと流し読み程度で読み終えた。

とは言いつつ、"SQL" は今後も廃れることのない技術の基礎として残り続けるだろう。新しい技術が出てきても SQL ベースになっていることが多く、UNIX などの OS の基礎といった同等のレベルで必要な知識だ。そういう意味で改めて一気に本書を読みきったことは、今後の Web アプリケーション構築の糧となるだろう。

集約機能の拡充

最近の SQL の潮流(?)的なものとして集約を SQL で活用できるような流れを感じる。BigQuery とかも SQL で大規模データにアクセスする感じだ。私たちが普段書いている Web アプリケーションのコードと違って、集約の SQL は複雑なクエリを書けるようになる必要がある。本書を読みたいと思った動機もそこにあった。

ただ本書は “SQL のすべて"ってことなので集約に関しての記述もその中の一部としての解説だったし、PostgreSQL に特化したって話でもないので実際に集約のみを重点的に学ぶとなると他の本の方がいいかもしれないと思った。私は以下の本をプログラマのための SQL を読む前に読んだのだけど、学ぶことが多くて良かった。大抵の Web エンジニアであれば本書を読むだけで十分な気もする。

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

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

また、集計の本格的な実例として以下の本も参考になった。特に PostgreSQL などの DB に最適化された内容で実践に即した内容なのですぐに使える知識として有意義だった。

ビッグデータ分析・活用のためのSQLレシピ

ビッグデータ分析・活用のためのSQLレシピ

私が直近で学んだデータベースに関してはそんなところだ。

終わりに

最近はブログ更新のアウトプットよりもこうしたインプットを重点的にやってきた。エンジニアは表面的なところ(プログラミングやフレームワークなど) を抑えたら次は裏の部分(OS, データベース, プログラミング言語そのもの) といった部分に興味というか、自分にとって必要だと感じるようになるのだろう。今回はその一環として “SQL” をテーマに深く学んできた。

次に作りたいものの大枠が見えてきたし、今回得た知識を活用して、またプログラミングをどんどんやっていきたい。