簡単な本の紹介

今回紹介する「SQLアンチパターン」は、データベースの論理設計や物理設計などで陥りやすい失敗をアンチパターンとして紹介し、失敗を避けるための対策や解決策を紹介している書籍である。

全体の構成としては

  • データベース論理設計のアンチパターン
  • データベース物理設計のアンチパターン
  • クエリのアンチパターン
  • アプリケーション開発のアンチパターン の4部構成になっており、その中でさらにいくつかの章に分かれている。

基本的に各章ごとに、1つのアンチパターンを取り上げて アンチパターン(好ましくない例) → アンチパターンの見つけ方・対策 → アンチパターンを用いてもよい例(例外など) → 解決策
という流れで、具体的な出来事やSQLなどのコードを踏まえながら話が進む。

読む前や読み始めは難しそう・とっつきにくそうという印象であったが、読みすすめてみるとよくありそうな身近なテーマについて触れていて、1章の長さも長くなく、比較的すぐに読めた。 少しの隙間時間にも読める良い本である。

なお、今回は去年出版された第2版を紹介するが、12年前に出版された第1版に一部追加・刷新された形で出版されている。 基本的な内容自体はほとんど変わっていないらしいので、第1版を読んだ人は改めて読む必要は少ないのではないかと感じた。

第1版はPHP、第2版はPythonで書かれている。ただ、例文のコードの8~9割くらいはSQLなので、Pythonが苦手な方もあまり気にしなくてもよいだろう。

もしPythonに自信がなく、PHPに慣れている方であれば、第1版を読むのも良いかもしれない。

オライリー本は日本語翻訳されていても読みにくいものが多い印象だが、この本はかなり読みやすいように感じた。

業務に関連しそうなこと

業務に参考になりそうな話や、過去に自分が悩んだことのある内容がいくつかあったので、印象に残った点を紹介する。

  • タグやIDなどの複数IDをカンマ区切りで保存する
    • 後から条件追加・集計・参照整合性の確保がほぼ不可能になるため要注意
    • 多対多の関係では、連関エンティティ(中間テーブル)を用いて設計するのがよい。中間テーブルには、仕様変更に耐えられるように(後から属性が増えそうか、履歴が必要かなど)意識して設計する必要がある。
  • 開発環境と本番環境のMySQLバージョンなどの違いによる動作不良に注意が必要
  • 1つのカラムに複数の意味を混在させないほうがよい。適切なカラム分け、データ分けが必要
  • インデックスをまったく貼らない、あるいはカーディナリティなどを考慮せずにやみくもに貼るのは共にパフォーマンスが悪くなる原因となる。
    • なるべくどこがボトルネックになっているかを計測し、効果が見込める箇所にインデックスを追加するのがよい
  • 1つのSQL文に長すぎる責務を持たせないほうがよい
    • 1文でまとめようとすると不必要に難易度が上がるので、適度に分割するのがよい。必要に応じて、ウィンドウ関数などの機能を活用するのも有効

基本的な内容が多いので、今リリースしているシステムでは上記のアンチパターンを採用していることはほとんどないかもしれないが、参考になれば幸いである。

ちなみに、自分がハッカソンや勉強等でGPTにコードやDB設計を書かせたときは、上記のほとんどすべてのアンチパターンを採用していたことがある。
今後、業務でAIを使う際は、チェックやレビューで特に注意が必要な内容かもしれない。

気になった内容を簡単に紹介したが、他にもいろいろ書いてあったので、興味を持った方はぜひ読んでみてほしい。

関連記事