「SQLアンチパターン」(データベース物理設計のアンチパターン)
勉強記録
「SQLアンチパターン」のⅡ部 データベース物理設計のアンチパターンを読んだので、学んだことをまとめました。
<9章> ラウンディングエラー(丸め誤差)
整数の代わりに小数値を使用したいときに、FLOATデータ型を使うこと
(なぜアンチパターンなのか)
丸め誤差が避けられない
※丸め誤差とは小数点以下の桁を省略したときに生じてしまう誤差のこと
(アンチパターンを使ってもいいとき)
科学技術計算を行うアプリケーション
(解決方法)
NUMERIC型やDECIMAL型を使う
FLOAT型とは保存方法が違う!
→NUMERIC型は数値を一度文字列とみなす。その文字列を2進数のデータで保存する。だから、入力されたデータに誤差が生じない!
<10章> サーティワンフレーバー(31のフレーバー)
列を特定の値に限定したいので、列にCHECK制約を定義をすること
※ CHACK制約とは、制約条件がFALSEになるような値の挿入や変更を拒否する
(なぜアンチパターンなのか)
新しいデータを入れたい時にALTER TABLEでテーブルの定義を変更しなければならない
(アンチパターンを使ってもいいとき)
オン/オフ、TURE/FALSE みたいな、どちらか一方を選択するような2つの値を指定する場合
(解決方法)
参照テーブルを用意する。外部キー制約をつけて、選択肢をデータ化する。
<11章> ファントムファイル(幻のファイル)
画像などの大容量ファイルをDBに格納したいので、ファイルをファイルシステムに格納して、ファイルパスをデータベースに格納すること
(なぜアンチパターンなのか)
→これを「トランザクション分離」という ※複数のDBにまたいだときにも起こる
画像とその他のデータが別々の場所にあるので、DBの画像へのパスだけ削除しても、ストレージに画像が残っている状態
(アンチパターンを使ってもいいとき)
DBの容量を減らしたいとき
プレビューや編集を容易にしたいとき→DB外にあれば画像を直接みながらの作業がしやすい
(解決方法)
必要に応じてBLOB型をつかう
BLOB型はあらゆるバイナリデータ(2進数すなわち0と1で構成されるデータ)を格納できる
※トランザクション分離について
ハイパフォーマンスにするために、サーバーを増やすことはよくある。
しかし、サーバーを増やすとトランザクションの分離が起きる。
バグが起きるので、トランザクションは維持しなければならない。→メッセージキューやNoSQLを使う(この辺はまた別の機会に勉強)
<12章> インデックスショットガン(闇雲インデックス)
パフォーマンスを最適化したいからといって、闇雲にインデックスを使用すること
または、全くインデックスを定義しないこと
(なぜアンチパターンなのか)
インデックスは貼った方が良いときと、貼らなくていい時がある
(アンチパターンを使ってもいいとき)
ない
インデックス設計ちゃんとしよう!
(解決方法)
「MENTOR」の原則に基づいて効果的なインデックスを作成する
MENTORとは、最適なインデックス作成を行うためのチェックリスト