画像はデータベース(DB)に格納した方がいいのではないか?

最近画像はDBに格納するべきではないかという考え方が自分の中で一般化している。

画像データを保存する方法で一般的なやり方は、どこかディレクトリを切ってそこに画像ファイルを置き、DBには画像のファイル名だけを持つというやり方が主流であると思う。

しかし普通データ等はDBに格納するのが普通だ。ではなぜ今まで画像をDBに持たせる方法が浸透しなかったのだろうか。考察してみる。

■元々DBはバイナリデータの保存に向いていない。よってDBに画像を格納する際に普通はbase64エンコード等をして文字型に変換して保存する為、データの容量が大きくなってしまう。またキャッシュ等が使えずに毎回動的に画像を生成するため、呼び出し際のオーバーヘッドがどうしても高くなってしまう。

                                      • -

確かにシビアにぎりぎりまでパフォーマンスが要求される場合や、どうしてもこのやり方でないと駄目な場合はしょうがないと思う。それでは自分が画像をDBに持たせるべきだと考える理由を紹介したい。

■ハードウェアの性能の向上
10年前であれば、確かにアプリケーションのパフォーマンスを極限まで高めることは必要だったかもしれない。しかし近年の飛躍的なストレージの安価化やハードウェアの性能向上で、以前ほどアプリケーションの性能を保つ必要がなくなってきた。

■セキュリティ性の性能向上
画像をディレクトリで格納するためには、ドキュメントルートより下に画像を格納しなければならない。しかし画像のセキュリティ性を保つにはDigital認証を使用しなければならなかったりして、セキュリティ性の甘さがどうしても出てしまう。DBはファイル管理よりも格段にセキュリティ性が高い。

■システムの保守・メンテナンスの容易性
データを全てDBで管理するためアプリケーションの処理が簡単になり、システムの保守性・メンテナンス性が高まる。それによってシステムの保守にかかる人件費が安くなり、システムの効率が高まる。

以上の事から、これからはDBに画像を格納すべし!!と思うのだが、みんなはどうなんだろう。
ちなみにやり方は簡単で、こんな感じ。

1、アップロードされたバイナリデータをbase64エンコードして、DBに突っ込む。DBの型はmysqlだったらmediumblob(16Mまで)とか。

2、表示の際に別のプログラムをincludeやrequireで呼び出し、DBから取得したデータをbase64デコードして適切なcontent-typeで出力する。

3、負荷が高まったらサーバーをクラスタリング化したり、mod_rewriteでキャッシュを使ったりして負荷を分散させる。

とりあえずこんな感じかな〜