- ベストアンサー
画像などの格納方法
お世話になります。 データベースで画像やPDFなどを扱う場合、そのファイルそのものをデータベースに格納する方法と、ファイル名を格納する方法があると思います。 ファイル名を格納する方法は行ったことがあるのですが、それぞれのメリットデメリットが解りません。あるいはこのよう場合はこちらのほうがよいとかあるのでしょうか。 1つにAccessのようにデータベースのサイズが制限させている場合はファイル実体を入れた場合すぐに制限を超えかねないので注意することぐらいしかわかりません。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
DBにはファイル名を入れて、「ファイルの実体をDB外で管理」するメリットは、 ・DBを経由することによるオーバーヘッドがない ことにつきるかと思います。とくに、Webサーバアプリケーションなんかでは、 画像表示のためだけに、ページ中の画像ごとにWebサーバアプリを起動して「サーバアプリがDBから読み込んでWebサーバに渡す」という処理を行うのはかなりの負荷になります。 一方、ファイルの実体をWebサーバから直接見えるようにしていれば、 画像の表示に関しては、サーバアプリを通す必要が無くなり、サーバアプリそのものの起動回数を減らすことができます。 あと、せいぜい数十キロバイト程度の画像で処理枚数がそれほど多くないならDB経由でもオーバーヘッドが問題にならないかもしれませんが、 枚数が非常に多いとか、ムービーなどで数百MBオーダーの世界になると、たとえDBに格納するサイズ的に問題なかったとしても、パフォーマンス的に実体のDB格納はありえないと思います。 ファイル名格納の欠点は、 ・ファイルの実体についてDB的な管理ができない といった点でしょうか。ファイルの管理のために、DBのシステム的なことを自前で処理する必要がでてきます。 たとえば、mixi では、画像データは別サーバに置いていて通常のDBとは別管理になっているのですが、その結果として ・ログインしていなくても(mixiの会員でなくても)記事に貼られた画像は見ることができる http://d.hatena.ne.jp/hasegawayosuke/20061017 という問題が出てます。 結局「DBを通す(というか認証システムを通す)とパフォーマンスが落ちる」という問題から、 これは「そういう仕様である」ということになっていたりします。 ちなみに、回答者さんのコメント > 昔画像ファイルを1フォルダに10万件以上も保管したシステムを扱ったことがあって、ファイル名のパターンで取り出そうとして、あまりの遅さに閉口した についてですが、確かに昔は「ファイル名は線形探索」なために、1ディレクトリのファイル数が多いと極端に遅くなるOSが普通でした。 ですが、OSにもよりますが、今では、そういった状況でもハッシュなどの採用で高速に動作するように改善されたOSが多いかと思います。
その他の回答 (2)
- jamshid6
- ベストアンサー率88% (591/669)
>この方式で早いということでしょうか? いや、そういう意味ではないです。 昔画像ファイルを1フォルダに10万件以上も保管したシステムを扱ったことがあって、ファイル名のパターンで取り出そうとして、あまりの遅さに閉口したことがあったからです。このレベルになると、LOBとは言えデータベースのインデックス検索の方がレスポンスでは勝るなと思った次第です。
お礼
ありがとうございます。 そういうことですか。 遅さの前に可視性などからサブフォルダわけしそうですね。 例え表示することは考慮しないシステムでも万一を考えて。
- jamshid6
- ベストアンサー率88% (591/669)
この質問は定期的にあるようなので、以下も参考にどうぞ。 (自分の書いた分で、今もそう思っているので) http://qanda.rakuten.ne.jp/qa4556689.html http://qanda.rakuten.ne.jp/qa4702028.html
お礼
ありがとうございます。 参考になります。 >対象の画像が数万件以上あるのであれば、フォルダアクセスするよりも早く取り出せる可能性はあると個人的には思います。 これは >SQL Serverの場合、Reporting Serviceなどを使っているとデータベース内の画像をファイルとして取り出すことなくレポートに割りつけられる この方式で早いということでしょうか?
お礼
ありがとうございます。 ファイルの実体をDB外で管理のきちんとしたというか本質的なメリットが分かった気がします。 ご回答を参考に自分でも調べていきます。特にWebでの問題ありがとうございます。