• ベストアンサー

画像などの格納方法

お世話になります。 データベースで画像やPDFなどを扱う場合、そのファイルそのものをデータベースに格納する方法と、ファイル名を格納する方法があると思います。 ファイル名を格納する方法は行ったことがあるのですが、それぞれのメリットデメリットが解りません。あるいはこのよう場合はこちらのほうがよいとかあるのでしょうか。 1つにAccessのようにデータベースのサイズが制限させている場合はファイル実体を入れた場合すぐに制限を超えかねないので注意することぐらいしかわかりません。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.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が多いかと思います。

takuma_18
質問者

お礼

ありがとうございます。 ファイルの実体をDB外で管理のきちんとしたというか本質的なメリットが分かった気がします。 ご回答を参考に自分でも調べていきます。特にWebでの問題ありがとうございます。

その他の回答 (2)

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.2

>この方式で早いということでしょうか? いや、そういう意味ではないです。 昔画像ファイルを1フォルダに10万件以上も保管したシステムを扱ったことがあって、ファイル名のパターンで取り出そうとして、あまりの遅さに閉口したことがあったからです。このレベルになると、LOBとは言えデータベースのインデックス検索の方がレスポンスでは勝るなと思った次第です。

takuma_18
質問者

お礼

ありがとうございます。 そういうことですか。 遅さの前に可視性などからサブフォルダわけしそうですね。 例え表示することは考慮しないシステムでも万一を考えて。

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

この質問は定期的にあるようなので、以下も参考にどうぞ。 (自分の書いた分で、今もそう思っているので) http://qanda.rakuten.ne.jp/qa4556689.html http://qanda.rakuten.ne.jp/qa4702028.html

takuma_18
質問者

お礼

ありがとうございます。 参考になります。 >対象の画像が数万件以上あるのであれば、フォルダアクセスするよりも早く取り出せる可能性はあると個人的には思います。 これは >SQL Serverの場合、Reporting Serviceなどを使っているとデータベース内の画像をファイルとして取り出すことなくレポートに割りつけられる この方式で早いということでしょうか?

関連するQ&A

  • DBにデータファイルを格納するメリット

    お世話になります。 勉強がてら携帯向けにPHP+MySQLで画像(Flash含)や動画配信するサイトを構築しています。 画像はデータベースに格納するか、ハードディスクから読み込むか迷っています。 イマイチそれぞれのメリットデメリット、また制限事項などを理解できていないのですが、その辺りをどなたかわかりやすくご教授いただけませんでしょうか。

    • ベストアンサー
    • MySQL
  • 画像ファイル

    WIndows2000 Access2000 フロッピーディスク内の画像ファイルをデータベースに格納したいのですがどのようにしたらいいでしょうか。 画像ファイルがハードディスクにある場合に データベースへの格納方法はわかっている状態です。 画像ファイルのテーブルの名前にパスを書いて、フォームでレコードが移動した際に パスから読み込むというヤツです。 Me.imgJpg.Picture = Me.画像名 というVBAを作成しています。 フロッピーディスク内の画像ファイルをいったんハードディスク内に保存したいのですが、どのように移動させたらいいのでしょうか。 ご指導お願い致します。

  • SQLiteに画像を格納したい

    作りたいと思っているシステムは、テキストと画像をDBに格納し、編集と削除ができるような簡単なデータベースのようなものです。 そこで、DBにはSQLiteを使おうと思っているのですが、調べてみたところSQLiteに画像を格納するのはあまりよくない(できない?ややこしい?)というような記事などを目にしました。 実際のところはどうなのか、ということをお聞きしたいです。 画像はただ単純にサーバーにアップロードするような方法が望ましいのでしょうか。 どなたかご返答頂ければと思います。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 日付や日時を格納する場合の型はどうしていますか?

    WEBアプリケーションで データベース(MySQL)を使うのですが、 日付や日時を格納する場合の型は varchar(10)、date、datetime のどれにしていますか? 文字型と日付型か迷っているので、 メリット、デメリットがあれば知りたいです。

    • ベストアンサー
    • MySQL
  • レジストリの格納場所

    「レジストリ」とはどこにデータが格納されているのでしょうか。 ハードディスク上ですか? 1ファイルとして存在するのですか? 変更方法はわかるのですが、実体はどこにあるのかなと思って質問します。 よろしくお願いします。

  • 【php】画像のアップロードの方法

    画像のアップロードは大きく分けて以下の3つの方法があると思います (1) ●画像を (ユニークID).jpg の名前で保存 呼び出すときは、ユニークIDに紐付いた画像を呼び出す。 (2) ●画像を (任意のファイル名).jpg の名前で保存 同時に、画像のファイル名をデータベースに保存。 呼び出すときはデータベースに保存されたファイル名に紐付いた画像を呼び出す (3) ●画像データをデータベースに直接保存 呼び出すときは、データベースから呼び出す どの方法が一番いいでしょう?

    • ベストアンサー
    • PHP
  • DB2のBLOB型カラムに格納されたファイルをアプリケーションで表示する方法

    こんばんは。 初歩的な質問なのですが、 宜しくお願いします。 データベースはDB2で、 BLOB型のカラムを持つテーブルがあります。 BLOB型のカラムには、PDFファイルが格納されています。 このPDFファイルを参照したいです。 どのようにすれば、 アクロバットリーダーで表示することができますか。

  • データベースに配列を格納する

    私はデータベースを本で勉強していたのですが物にするため、実際にデータベースのプログラムをくんでみようと設計を考えたのですが、疑問があります。 私はデータベースに、プログラム上で取り扱っているサイズがことなる複数の配列内のデータを格納したいのですが、これはデータベースにどのように格納すればよいのか分からず困っています。 図で説明すると 例えば {1} {12 33 24 21} {13 56 0 1} という3つの配列を同じデータベースに入れようとした場合 ID int1 int2 int3 int4 1 1 null null null 2 12 33 24 21 3 13 56 0 1 という形で入れる事になると思いますが、ここにサイズが5の配列をいれようとした場合は列が増えることになってしまいます。すると色々めんどくさいことになるのではないかと思います。 このようなデータベースに入れるデータのサイズが分からない場合は、どのようにするべきなのでしょうか?(なおJDBCを使い、SQLiteに入れています) やや抽象的かつ、意味がわかりにくい質問ですが不足な点は説明させていただきますので、ご回答よろしくお願いします。

    • ベストアンサー
    • MySQL
  • ACCESS リンク画像を帳票に表示したい

    MSアクセスの帳票フォームにイメージを格納したフォルダからのリンク画像を表示したいのですが、うまくいきません。 画像数が多く、データベース容量の制限をこえるため、他のフォルダから直接読み込みたいと想っています。 単票についてはイメージオブジェクトを使用しての表示方法をみかけるのですが... 何方様か、お知恵をおかしくださいませ。

  • BLOB型のPDF出力の方法

    BLOB型にPDFファイルが格納されているテーブルの列を、select文で抽出して、拡張子にpdfをつけてファイル出力したのですが、BLOBで定義している最大サイズで必ず出力されてしまいます。 pdf のファイルをテキストで開いてみると、エンド(%%EOF)以降が空欄でBLOBのサイズの大きさまで充填されていました。 BLOB型にPDFファイルを格納してある場合の出力方法はどうすればいいのでしょうか?

    • ベストアンサー
    • MySQL