画像をファイルとして保存するか、Webアプリのデータベースに保存しますか?


124

私の質問はかなり一般的であり、100%の回答が得られない可能性があることは知っています。多くの画像と、できればかなりの量のトラフィックを含むASP .NET Webソリューションを構築しています。私は本当にパフォーマンスを達成したいです。

画像をデータベースまたはファイルシステムに保存する必要がありますか?答えに関係なく、なぜ特定の方法を選ぶのかということにもっと興味があります。

ステファン、ありがとう

DUPLICATE画像をDBに保存する-そうですか?ファイルシステム画像を保存する方法、少数の画像を保存する:blobまたはfs?そしておそらく他のいくつか。


コメント:多くの良い答えをありがとう。100%データベース駆動型のソリューションを考えている場合でも、ファイルベースのソリューションを採用します。今日、データベースなどで私がやりたいことを行うには良い解決策があるようですが、それをしない理由はいくつかあります。

  • 私はホステッドソリューションを利用しますが、私には膨大な量のストレージ(10 GB)がありますが、データベースには300 MBしかありません。DB内の追加のストレージに多くのコストがかかります。

  • 私はDBエキスパートではなく、DBの設定を制御することもできません。DBベースのソリューションでは、次のようにカスタム構成が必要になる場合があります。

独自のサーバーでサイトを実行する場合は、DBベースのソリューションを検討します。ありがとう、ステファン


1
使用しているデータベースを指定してください。
ジェリーシェンク、

1
新しいバージョンのMSSQLを使用するつもりです。
StefanE 2009

1
@StefanE、ファイルシステムは、あらゆる目的で、ファイルストレージ用に最適化された専用データベースです。
LukeH、2009

回答:


175

画像をファイルシステムに保存し、画像の場所をデータベースに保存します。

どうして?なぜなら...

  1. 画像を静的ファイルとして提供できます。
  2. 画像を取得するために、データベースアクセスやアプリケーションコードは必要ありません。
  3. 別のサーバーから画像を提供して、パフォーマンスを向上させることができます。
  4. データベースのボトルネックを軽減します。
  5. データベースは最終的にそのデータをファイルシステムに格納します。
  6. 画像は、ファイルシステムに保存するときに簡単にキャッシュできます。

1
また、SQL Serverでは、画像を「Image」フィールドとして保存すると、SQLが実際に行っていること、つまりディスク上のファイルへのポインタをどこかに保存することになります。これは、8KBのページ制限を回避する方法です。
Zhaph-Ben Duguid、2009

9
これは、実際に新しい導入タイプFILESTREAMのがありましたSQL Server 2008ので対処されているtechnet.microsoft.com/en-us/library/bb895234.aspx allowesは、ファイルシステムのパフォーマンス」を活用すると同時に、維持するために、非構造化データと対応する構造化データ間のトランザクションの一貫性」
kristof

ええ、あなたは正しく書きます。私の質問は、ブロブのサイズは何ですか?またはどれだけのメモリを保存できますか?
Ameer 2013年

11

最近開発したプロジェクトでは、画像(およびあらゆる種類のバイナリドキュメント)をデータベーステーブルの画像列として保存しました。

データベースにファイルを保存することの利点は、データベース(=メタデータ)とハードディスク(=ファイルストレージ)の間の同期が組み込まれていないため、レコードが削除されてもハードディスク上の参照されないファイルがなくなることは明らかです。手動でプログラムする必要があります。

今日のテクノロジを使用して、SQL Server 2008 FILESTREAM列に画像を保存することをお勧めします(少なくとも、次のプロジェクトでこれを実行します)。これは、データベースにデータを格納する利点と、(少なくとも広告によると;))


Filestream機能をテストしたことはありますか?
StefanE 2009

1
実際には、DBレコードを削除するときに、ファイルシステムからも削除するようにコーディングできます。したがって、DBではなくFSに保存するのが良いと
思います


6

ファイルをファイルとして保存することをお勧めします。データベースによってBlobデータの処理方法が異なるため、バックエンドを移行する必要がある場合、問題が発生する可能性があります。

画像を提供する場合、サーバーに既に存在するファイルに<img src =を使用すると、データベースフィールドから一時ファイルを作成して<imgタグを指すよりも高速になる可能性があります。

私はあなたの質問をグーグルで調べ、http://databases.aspfaq.com/database/should-i-store-images-in-the-database-or-the-filesystem.htmlでコメントを読んでこの答えを見つけました


1
紹介記事は少し古くなっているようです。
devio 2009

6

私は通常、データベースにバイナリファイルを含めるのが好きです。

  • データの整合性:参照されていないファイルはなく、ファイルに関連付けられていないデータベース内のパスはありません
  • データの整合性:データベースのダンプを取るだけです。いいえ、「このデータディレクトリをtargzするのを忘れました。」

4

データベースに画像を保存すると、単一の画像を提供するためのDBオーバーヘッドが追加され、そのレベルに達すると代替ストレージ(S3、Akami)にオフロードすることが難しくなります。それらをデータベースに格納すると、今すぐ移動する必要があるのはDBだけなので、アプリを別のサーバーに移動するのがはるかに簡単になります。

画像をディスクに保存すると、代替ストレージへのオフロードが簡単になり、画像が静的要素になるため、画像をキャッシュ可能にするためにWebアプリのHTTPヘッダーをいじる必要がありません。欠点は、アプリを別のサーバーに移動した場合、画像も移動することを覚えておく必要があることです。簡単に忘れられるもの。


3

Webベースのアプリケーションの場合、ファイルシステムを使用して画像を保存することで、パフォーマンスが向上します。そうすることで、アプリケーション内の複数のレベルで画像のキャッシュを簡単に実装できます。データベースに画像を保存することにはいくつかの利点がありますが、ほとんどの場合、これらの利点はクライアントベースのアプリケーションにあります。


0

これまでのところ、すでに良い答えにいくつか追加するだけです。データベースに画像を保持するルートをたどると、Webレベルとデータベースレベルの両方からキャッシュのメリットを享受できます。

データベースについては、画像に関連付けられたテキストデータに関連して画像を保存する方法と、特定のクエリに画像にアクセスしてデータベースがクエリをキャッシュできるようにすることでこれを実現できると思います(理論的にはその部分で私を核にしてください)。

Web側では、質問がasp.netでタグ付けされているので、httpハンドラーを使用して画像を提供するルートに進むと思います。そうすれば、フレームワークのすべての利点を自由に利用できるようになり、イメージのキーをhttpハンドラーに渡すだけで、ドメインロジックをよりクリーンに保つことができます。


-1

ファイルを保存するために個別のNoSqlデータベースを選択しないのはなぜですか。

@chburdが述べたように、データの整合性、データの一貫性をもたらします。

rdbmsはまだ小さいままですが。


-1
  1. これは、Eclipseファイルシステムに画像を保存し、DBにそれらのメタデータを保持する段階的な例(一般的なアプローチ、Springの実装)です 。http://www.devmanuals.com/tutorials/java/spring/spring3/mvc /Spring3MVCImageUpload.html
  2. ここにも例があります-http://www.journaldev.com/2573/spring-mvc-file-upload-example-tutorial-single-and-multiple-files
  3. また、このプロジェクトのコードベース(https://github.com/jdmr/fileUpload)を調査することもできますこのコントローラーに注意してください
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.