11.1 目的:画像をはじめとする大容量メディアファイルを格納する
11.2 アンチパターン:物理ファイルの使用を必須と思い込む
画像のデータを保存する時、どのように保存するか
- 画像のバイナリデータとしてBLOB型でDBに保存する?
- 画像をファイルシステムにファイルとして格納し、ファイルパスをVARCHAR型でDBに保存する?
筆者はバイナリ派。外部ファイルは大きなリスクを伴うので
11.2.1 ファイルの削除時における問題
- DBで画像へのパスを含む行を削除しても、その指定先のファイルは自動で削除されない
- 行削除と同時に指定先のファイルも消さないといけない
11.2.2 トランザクション分離の問題
- DBのコミットとファイルの参照できる、できないは別のタイミングで変わる
- 現実的にそれほど問題にならない
11.2.3 ロールバック時における問題
- DELETE文をrollbackしようとしてもファイルを削除してしまっていれば元に戻せない
11.2.4 データベースのバックアップツール使用時における問題
- DBのバックアップを支援するクライアントツールとの連携
- ファイルのパスとは別に外部ファイルのバックアップも取る必要がある
- DB外部ファイルの同期はどうするのか
11.2.5 SQLアクセス権限使用時における問題
- 外部ファイルにはGRANTやREVOKEなど、SQLステートメントで割り当てるアクセス権限が適用できない
- DBで文字列で指定された外部ファイルのアクセス権までは管理できない
11.2.6 ファイルはSQLデータ型ではない
- 格納されたパスの文字列が正当であるとを、DBはを検証しない
- DBは指定されたパスにファイルが存在すること検証できない
- ファイル名が変更されたり、ファイルの移動削除が行われてもDBの文字列は自動で更新されない
- 文字列をパス名として扱うのはアプリケーションが保証することになる
11.3 アンチパターンの見つけ方
まあいいや。。。
11.4 アンチパターンを用いても良い場合
- データベースの容量を減らせる
- データベースのバックアップが短時間で終了し、かつバックアップファイルの容量も抑えられる
- 画像がデータベース外にあれば、プレビューの編集が容易になる
で、結局どうなんでしょう
みんなで議論しましょう