web-dev-qa-db-ja.com

画像の保存:ファイルまたはblob?

画像を保存するとき(画像がたくさんあると仮定します)、データベースにblobとして保存しますか、それともファイルとして保存しますか?どうして?

重複: DBに画像を保存する-はいまたはいいえ?

16
kurast

私は通常、それらをファイルとして保存し、パスをデータベースに保存します。私にとっては、blobとしてデータベースにプッシュするよりもはるかに簡単で自然なアプローチです。

それらをデータベースに保存するための1つの引数:完全バックアップを実行する方がはるかに簡単ですが、それはニーズによって異なります。データベース(画像を含む)の完全なスナップショットを簡単に作成できるようにする必要がある場合は、それらをブロブとしてデータベースに保存するのがおそらく最善の方法です。それ以外の場合は、データベースのバックアップとファイルのバックアップをペアにして、どういうわけか2つを関連付けようとする必要があります。これにより、復元を実行する必要がある場合に、復元するペアがわかります。

17
Brandon Wood

画像のサイズによって異なります。

Microsoft Researchには、この件に関して 興味深いドキュメント があります。

10
Sean

私はdb(SQL ServerとMySQL)を使用して中(<5mb)ファイルを保存しようとしましたが、私が得たのはたくさんの問題でした。

1)一部のDB(SQL Server Express)にはサイズ制限があります。

2)一部のDB(MySQL)は致命的に遅くなります。

3)オブジェクトのリストを表示する必要がある場合、誤ってSELECT * FROMテーブルを実行すると、大量のデータがデータベースから上下に移動しようとするため、応答が非常に遅くなるか、メモリ障害が発生します。

4)一部のフロントエンド(Ruby ActiveRecord)では、blobの処理に非常に大きな問題があります。

ファイルを使用するだけです。それらをすべて同じディレクトリに保存しないでください。いくつかの手法を使用して、それらを複数のディレクトリに配置してください(たとえば、GUIDの最後の2文字またはintidの最後の2桁を使用できます) )次に、パスをdbに格納します。

9
giorgian

データベースサーバーのパフォーマンスへの影響は重要な問題です。ファイルシステムのパフォーマンス上の利点が必要な場合は、最初のリクエストでファイルシステムをキャッシュするだけです。後続のリクエストは、直接リンクによってファイルシステムから直接処理できます(Webアプリの場合、出力バッファーをフラッシュする前にHTMLを書き換えることができます)。

これは、両方の長所を提供します。

  • 信頼できるストアはデータベースであり、トランザクションと参照整合性を維持します
  • データベースをデプロイするだけで、すべてのユーザーデータをデプロイできます
  • このキャッシュを空にすると(たとえば、Webサーバーを追加することによって)、自動的に補充される間、一時的なパフォーマンスの低下が発生するだけです。

常に変更されないもののためにデータベースを絶えず槌で打つ必要はありませんが、重要なことは、ユーザーデータがすべてそこにあり、さまざまな場所に散らばっていないため、マルチサーバーの操作と展開が完全に混乱することです。私は常に「データベースをユーザーデータストアとして使用しない」というアプローチを提唱しています。これは、アーキテクチャが優れており、効果的なキャッシュで必ずしも遅くなるとは限らないためです。

そうは言っても、ファイルシステムを信頼できるストアとして使用する正当な理由は、ファイルシステムにアクセスするために外部の独立したツールを実際に使用する必要がある場合です。 SFTPなど。

3
Sfynx

問題は、アプリケーションがBLOBまたは他のアプリケーションデータのような他のファイルを処理するかどうかです。ユーザーは他のデータと一緒に画像をアップロードしますか?その場合は、BLOBをデータベースに保存する必要があります。これにより、データベースのバックアップが容易になり、問題が発生した場合に、トランザクションの一貫性のある状態に回復することが容易になります。

しかし、ユーザーデータではなく、アプリケーションインフラストラクチャの一部である画像を意味する場合、おそらく答えは「いいえ」です。

2
APC

1つのWebサーバーで実行していて、1つのWebサーバーでのみ実行する場合は、それらをファイルとして保存します。複数のウェブヘッドで実行している場合は、画像の参照インスタンスをデータベースBLOBに配置し、ファイルとしてウェブヘッドにキャッシュします。

2
chaos

名前、簡単な説明、作成日、作成者などと一緒に画像を保存したい場合は、データベースに保存する方がよい場合があります。そうすれば、すべてが一緒になります。これと同じ情報を保存して画像をファイルとして保存した場合、「画像オブジェクト」全体を2か所から取得する必要があります...そして、将来的には、同期の問題が発生する可能性があります(一部の画像が見つかりません) 。うまくいけば、これは理にかなっています。

2
Mikey

保存するということは、それらを使用してWebページなどに表示することを意味しますか?その場合は、ファイルを使用することをお勧めします。データベースを使用する場合は、写真のリクエストで常に打撃を受けます。そして、それはあまりうまくスケーリングしない状況です。

2

ブロブはdb/scriptsに重い場合がありますが、パスを保存するだけではどうでしょうか。私たちがこれまでblobを使用した唯一の理由は、それをマージ複製する必要がある場合、またはアセットのセキュリティを非常に厳しくする必要がある場合です(ログインしていない限りイメージをプルできないなど)

1
Chet