SQL anti-pattern
NULLに対する誤解の例 NULLは「何も無い」を表す これだと 「1 + NULL」が「NULL」になる説明ができません。 1に対して「何も無い」を足すとそのまま1になりそうですが、SQLではNULLにいかなる演算を行ってもNULLしか返しません。 NULLは「適応不能」を表す …
MVCのM(モデル)を単純化する ソフトウェア開発の80%は知的作業であり、そのほとんどが創造的な作業です。 この知的作業を支援してくれるのが、デザインパターンなどの規約です。 Singleton、Facade、Factoryなどのパターン名を使うことで、チームのメンバー…
SQLでパスワードを平文で格納してはいけない データベース設計における重大なセキュリティリスクのうちの一つに、SQLでパスワードを平文で格納するというものがあります。 これは重大なセキュリティ欠陥であり、権限のない人に特権的なアクセスを与えるセキ…
全ての結果を一つのクエリで出そうとしてはいけない 電話で幹部と話している上司が、いきなりあなたの机に来てこう言いました。 「SQLを使って次の4つの値を調べて欲しい。開発者一人当たりの平均バグ修正数、修正したバグの中で顧客から報告された数、バグ…
副題 問題にぶつかると「正規表現を使えばいい」という人がいる。 そして問題を二つ抱えることになる。 事例:検索エンジンの必要性 webサイトで記事の数が膨大になるにつれて、検索機能の必要性が明らかになる。 分類して設置しておくことも一つの解決策だが…
ケース(ランダムセレクション) あなたはweb広告を表示するアプリケーションの担当者だ。 広告は適当なテーブルからランダムに選ばれる仕組みだ。 ある日webサイトが日に日に重くなるインシデントが起票され、その原因があなたが担当するアプリケーションにあ…
概要(良いクエリ) ある程度SQLを学んだプログラマーは、クエリでGroup Byと集約関数(MIN,MAX,SUM,COUNTなど)を巧みに用いて集計することを覚える。 少量のコードで複雑なレポートを作成できる強力な機能である。 例えば「product_idごとにレポート日付の最大…
インデックスについて インデックスとは、データの値と格納場所を結びつけるデータベースオブジェクト。 正しく使うとデータベースの検索の高速化が可能になる。 作成例 create table staff( id int , name varchar(10), description varchar(400), PRIMARY …
データベースで画像を保存するべき理由と方法 この記事では外部リソースに画像を保存する方法ではなく、データベースに画像を保存する方法のメリットとやり方を紹介する。 まず簡単に結論を述べると、データベースは外部リソースを管理することはできない。 …
マルチカラムアトリビュート 複数列属性を持つようなアンチデザインパターンのこと。 SQLテーブルに対して列に対して年度や携帯電話番号など、これから増える可能性のあるものをカラムとして設定すると厄介な事象が発生します; 複数の値を持つ属性を格納す…
ポリモーフィックなテーブルを作成したい。 あなたはバグレポートを管理するシステムを作成しようとしています。 そしてこのバグレポート管理システムに新たなる要件が届きました。 その要件とは「バグについてのコメントを書き込めるような機能が欲しい」と…
この記事は? SQLアンチパターンの備忘録です。 特に今回は5章の「エンティティ アトリビュート バリュー」 と呼ばれる手法の悪い点と改善策をまとめました。 エンティティ アトリビュート バリュー とは あなたはバグレポートを管理するシステムを作成しよ…
結論を述べると、外部キー制約はテーブルを健全な状態に保つ役割を果たしている。データベースを利用しているアプリケーションが、参照整合性を保つための完璧なコードを前提としているような状態は避けるべきである。 参考記事 この記事は以下の書籍を参考…