ハウテレビジョンブログ

『外資就活ドットコム』『Liiga』『Mond』を開発している株式会社ハウテレビジョンのブログです。

第二回 課題図書知見共有会 ~SQLアンチパターン~

はじめに

私たち新卒エンジニア4名は、SQLアンチパターン を読み、第二回図書知見共有会を開催しました。 今回この本を選択したのは業務で扱うことが多いにも関わらず、テーブル設計やSQLに詳しくないことが私たちの共通点だったからです。 本稿ではSQLアンチパターンを読み終えた後の知見共有会についてまとめていきます。

本の紹介

SQLアンチパターン*1

本書はDB設計やSQL記述の際に避けるべき事柄を1章で1つ、25個紹介する書籍です。 リレーショナルデータベースを中心に据えたシステム開発には、様々な場面で陥りやすい失敗(アンチパターン)があります。 本書はデータベース論理設計、データベース物理設計、クエリの記述、アプリケーション開発という4つのカテゴリに分かれて、それぞれの分野におけるアンチパターンを紹介し、失敗を避けるためのより良い方法を紹介します。 複数の値を持つ属性や再帰的なツリー構造の格納から、小数値の丸めやNULLの扱いに起因する問題、全文検索やSQLインジェクション、MVCアーキテクチャなど、実践的かつ幅広いトピックを網羅します。 データベースに関わるすべてのエンジニア必携の一冊です。

得られた知見

数字データは丸め誤差が起きる
小数値を扱いたいときに、データベースのカラムの型として「FLOAT」を使用することは一般的です。FLOAT型は浮動小数点数を表現するためのデータ型であり、実数を近似的に表現することができます。 ただし、FLOAT型を使用する際には注意が必要です。浮動小数点数の精度には限界があり、計算誤差が生じる可能性があります。例えば、0.1 + 0.2 を計算すると、厳密な値である 0.3 とはわずかに異なる結果が得られることがあります。このような計算誤差が問題となる場合は、NUMERIC型やDECIMAL型などの固定小数点数を使用することが推奨されます。 したがって、FLOAT型を使用する場合は、データの精度要件や計算の正確性を考慮し、適切な型を選択することが重要です。正確な計算が求められる場合には、DECIMAL型を検討するなど、適切なデータ型の選択を行うことが良いデータベース設計の一環となります。

SQLのNULLの演算
NULL値は、SQLデータベースでしばしば遭遇する特殊な値です。NULLは、値が存在しないことを表すために使用され、欠落や未知の値を示す場合に利用されます。しかし、NULL値の扱いには注意が必要であり、正しい演算法を理解することが重要です。
NULL演算には以下の法則が存在します。

  1. NULLとの比較:NULL = NULL は常にFALSEとなります。NULL値は未知の値であるため、他のNULL値と等しいかどうかは判断できません。

  2. NULLとの不等号比較:NULL <> NULL = FALSE、NULL > 値 = FALSE、NULL < 値 = FALSE となります。NULL値は未知のため、他の値との大小関係を判断することはできません。

  3. NULLとの演算:NULL + 数値 = NULL、NULL - 数値 = NULL、NULL * 数値 = NULL のように、NULLと数値の演算結果は常にNULLとなります。NULL値が含まれる演算は、結果もNULLとなります。

  4. NULLとの論理演算:NULL AND TRUE = NULL、NULL OR FALSE = NULL、NOT (NULL) = NULL のように、NULLとの論理演算結果はNULLとなります。ただし、NULL AND FALSE = FALSE、NULL OR TRUE = TRUE とNULLにはならないので、注意が必要です。

以上が、NULL演算の法則です。NULL値は特殊な値であり、通常のデータと同じように取り扱うことはできません。NULLを扱う際には、これらの法則を理解し、注意深く対応する必要があります。

適切な場面でインデックスを指定しよう
データベースのパフォーマンスを向上させるために、インデックスの適切な使用は欠かせません。インデックスはデータベースの検索処理を高速化するための重要なツールですが、適切な場面でインデックスを指定することが成功への鍵です。以下に、適切な場面でインデックスを指定するためのポイントを3点列挙します。

  1. 頻繁に検索される列にインデックスを作成する:データベース内で頻繁に検索される列は、インデックスの対象として最適です。検索の効率を向上させるために、WHERE句やJOIN操作で頻繁に使用される列にインデックスを指定しましょう。

  2. 大量のデータが格納されるテーブルにインデックスを作成する:レコード数が多いテーブルは検索が遅くなりがちですが、インデックスを適切に設定することで検索速度を向上させることができます。特に結合操作やソート、集約関数の使用が多いテーブルには、インデックスの設定が有効です。

  3. ユニーク制約や主キー制約がある列にインデックスを作成する:ユニーク制約や主キー制約がある列は、データの一意性を保証するために重要です。これらの列にインデックスを指定することで、データの一意性の確認や結合操作の効率化が可能となります。

適切な場面でインデックスを指定することは、データベースのパフォーマンス向上に直結します。効果的なインデックスの設定により、検索や結合操作の処理速度が向上し、データベースの応答性が向上します。

一方で、上記で挙げたような目的以外でインデックスの過剰な使用や不適切な設定はデメリットをもたらす可能性もあります。インデックスはデータベースの容量を増やし、データの変更操作や新規データの挿入にも影響を与えることがあります。そのため、インデックスを設定したことによって逆にパフォーマンスが落ちることもあるので気を付けましょう。

ディスカッション

議題としては以下が挙がりました。

画像の保存を外部に置くことはアンチパターン? SQLアンチパターン11章ファントムファイルより
画像などのメディアファイルをどこに保存するのがいいのか。 私達の過去の開発経験を振り返りつつ考えてみると、外部(AWS S3など)に保存しDBにはそれを参照するURLを入れておくことが一般的のように思いました。 しかし、本書によるとそのやり方はファントムファイルというアンチパターンだそうです。 ポイントとしては以下が挙げられます。

  • ファイル削除時の問題

  • トランザクション分離の問題

  • ロールバック時における問題

  • データベースのバックアップツール使用時における問題

  • SQLアクセス権限使用時における問題

これらの問題を踏まえ、本書ではBLOB型でDBに保存することを推奨しています。 確かに本書に示すような問題はあるでしょう、しかしながらこれらの問題に気をつけてしっかりと管理をしていれば外部保存の手法も決して悪くはないのではないでしょうか? 本書の知見、そして同期との議論を通し今まで当たり前にしていた実装を注意深く見れるようになったかもしれません。

既にアンチパターンなテーブルと私たちはどう向き合っていくのか
データベースのテーブル設計において、アンチパターンなテーブルと向き合うことは私たち新人社員にとっても重要な課題です。そこで、今回はアンチパターンなテーブルとどう向き合っていくべきか、私たちの視点から提案したいと思います。

  1. 問題の洗い出しと理解:アンチパターンなテーブルに直面したら、まず問題点を洗い出し、その理由や背景を理解することが重要です。不適切な設計やパフォーマンスの低下など、具体的な問題点を把握しましょう。

  2. チームメンバーとのコミュニケーション:テーブルの設計や改善に関しては、他のチームメンバーとのコミュニケーションが欠かせません。問題点や改善案を共有し、アイデアや意見を出し合いましょう。新人であっても積極的に参加し、アンチパターンの解決に向けて貢献しましょう。

  3. プロジェクトへのフィードバック:アンチパターンなテーブルに遭遇した経験や学びを、プロジェクトチームや上司にフィードバックしましょう。改善案や適切な設計原則の導入など、アンチパターンの予防策について提案することで、より良いデータベース設計への貢献が可能です。

アンチパターンなテーブルと向き合うことは、新卒社員にとって大きなチャレンジですが、同時に成長の機会だと前向きに捉えたいです。同僚やメンターとの協力を大切にしながら、アンチパターンなテーブルに立ち向かいましょう。

まとめ

第二回図書知見共有会では読書前には知らなかった知識であったり、正しい実装と思っていたものが間違っていたりなどの発見がありました。 今回話し合ったアンチパターンに心当たりがある一同。 特にアンチパターンによってとんでもない技術負債が引き起こされるということを私たちは学びました。 今後はアンチパターンを使ってしまわないよう細心の注意を払って業務に取り組んでいきたいと強く思いました。 実際にテーブル設計をしてレビューし合う会をやってみよう!という話も出てきたり意欲的に学んでいく所存です。

次回はどんな本を読むかは未定ですが、今回のように多くのことを学んでいければと思いますのでお楽しみに!

*1:Karwin, B., Wada, T., Wada, S., & Kojima, O. (2013). Esukyūeru anchipatān. Orairījapan. SQLアンチパターン | Bill Karwin, 和田 卓人, 和田 省二, 児島 修 |本 | 通販 | Amazon