「SQLアンチパターン」を読んで【第Ⅱ部】
書籍
- 作者:Bill Karwin
- 出版社/メーカー: オライリージャパン
- 発売日: 2013/01/26
- メディア: 大型本
はじめに
読んだ書籍は1記事にまとめると文量が多くなるため、導入+各部ごとの記事としてまとめる。
本記事は「第Ⅱ部:データベース物理設計のアンチパターン」になる。その他の部についての記事は下記参照。
- 導入
- 第Ⅰ部:データベース論理設計のアンチパターン
- 第Ⅱ部:データベース物理設計のアンチパターン(本記事です。)
- 第Ⅲ部:クエリのアンチパターン
- 第Ⅳ部:アプリケーション開発のアンチパターン
印象に残った点
※ 下記のカッコ書きは該当する章番号。
ラウンディングエラー(丸め誤差)[9]
- 目的:整数の代わりに小数値を使用する - アンチパターン:FLOATデータ型を使用する - 丸めが避けられない - 浮動小数点数の誤差累積がでる - アンチパターンを用いてもよい場合 - 科学技術計算を行うアプリケーション - 解決策:NUMERICデータ型を使用する - 精度とスケールを指定し固定精度の小数点数を表現する
- 保守している製品は計算に利用する値を一旦文字列型データとしてDBに入れ、アプリ側で利用する際は数値に戻して計算することが多い。SQLを使った計算をすることがなければそれで良いのかもしれない。
サーティーワンフレーバー(31のフレーバー)[10]
- 目的:列を特定の値に限定する - アンチパターン:限定する値を列定義で指定する - 限定する値の取得が難しい - 値の追加や削除が手間 - CHECK制約がDBMSによって異なるため移植が困難 - アンチパターンを用いてもよい場合 - 相互排他的な2つの値(例:左/右、有効/無効) - 解決策:限定する値をデータで指定する - 限定する値の参照テーブルを用意し、外部キー制約で参照する
- CHECK制約を使うタイミングは気をつけないといけないなぁ。この本を読めば読むほど保守している製品のDBの使い方がユルユルだと感じる。
ファントムファイル(幻のファイル)[11]
- 目的:画像をはじめとする大容量メディアファイルを格納する - アンチパターン:物理ファイルの使用を必須と思い込む - レコード削除時にファイルが連動して消えない - ロールバックしてもファイルが消えない - SQLのアクセス権と外部ファイルのアクセス権が一致しない - レコードにある画像パスが正しいとは限らない - アンチパターンを用いてもよい場合 - DBの容量を減らしたい - バックアップを短時間で終わらせたい - 画像ファイルの編集やプレビューを容易にしたい - 解決策:必要に応じてBLOB型を採用する
- 保守している製品は外部ファイルを用いているが、運用を考えるとアンチパターン採用した判断には賛成できる。
- SQL Server 2008にはFILESTREAMという型があるのか。実際に利用している記事があまり見つからなかった。(使い方紹介が多い。)
インデックスショットガン(闇雲ショットガン)[12]
- 目的:パフォーマンスを最適化する - アンチパターン:闇雲にインデックスを使用する - そもそもインデックスを利用しない - インデックスを多くを定義し過ぎる - アンチパターンを用いてもよい場合 - なし(情報を集め検討することが必要) - 解決策:「MENTOR」の原則に基づいて効果的なインデックス管理を行う - Measure(測定):クエリのパフォーマンスを測る - Explain(解析):クエリの処理が遅くなる原因を解析する - Nominate(指名):インデックスを使わないでアクセスしている箇所を特定する - Test(テスト):変更による効果を確認する - Optimize(最適化):キャッシュサイズを最適化する - Rebuild(再構築):不均衡なインデックスを整える