web-dev-qa-db-ja.com

画像をデータベースまたはフォルダに保存する必要がありますか?

重複の可能性:
DBに画像を保存する-そうですか、それともそうですか?

こんにちは

現在、私のWebサイトの各会社には、プロファイルに追加できる写真が1枚あります。私はその画像をデータベースに保存します....その会社のロゴ。

今、私は彼らにもっと写真を追加させたいと思っています。すべてをデータベースに保存する必要があるのか​​、フォルダに保存する必要があるのか​​わかりません。

フォルダーが良くなると思う理由は、私が使用できる派手なシルバーライトのような機能を備えた素敵な記事がたくさんあるからですが、それらはすべてフォルダーに保存された画像にしか対応していません。

そして、私はそれほど良くないので、画像検索にフォルダーを使用する例の代わりにデータベースを見るようにコードを変更するのは難しいです。

私のウェブサイトにこのようなものを追加したいと思います(画像を閲覧します)。画像がデータベースに保存されているときにこれを行う方法に関するコード例はありますか?私はVB.netでASP.NETを使用しています。 私が話していることを表示するにはここをクリックしてください

アイデアはありますか?

よろしくエティエンヌ

24
Etienne

私は最近、個人的に両方の方法でそれを行いました。私は、DBにプロパティを保持しながら、画像を保存するためにディレクトリ方式を使用することを好みます。

主な理由:ウェブサイトを作成したクライアントがいました。 Webisteで;ユーザーが新しい写真をアップロードできるフォトギャラリーセクションがありました(公開サイトから閲覧できます)。私のクライアントはアップロードする前に画像を最適化することを考えていなかったので、 * .jpgは1MBを超えていました。イメージを更新する機能を実装しましたが(DBに保存された後)、一度に1つのレコードを実行する必要がありました。

画像をディレクトリに保存しているときにこれが発生した場合は、ファイルをローカルに保存して最適化し、サーバーに戻すことができます。

ここに例があります

15
Gthompson83

私はフォルダに行きます。ストレージスペースが不足した場合の柔軟性(別のディスクに移動して再ポイントするだけ)、他のアプリ(Silverlightなど)の柔軟性。安全でなければならないファイルにのみDBを使用します。

13
Program.X

これに関する2つの考え:

  1. ファイルシステムを使用します。ただし、1つのフォルダーが画像で過負荷にならないようにスキームを十分に設計し、管理するのが悪夢になるようにしてください。たとえば、識別子の最初または最後の文字、または後続の位置表記を使用してツリー化できます。マイレージはさまざまなので、スキームがデータセット(画像)のサイズに合っていることを確認してください。たとえば、20枚の画像しか管理していない場合は、詳細に説明する必要はありません。

  2. SQL Server 2008を使用します。ファイルストリームと呼ばれる新しいデータ型があり、画像はファイルシステムに保存されますが、標準のデータベースクエリを介して取得できます。詳細については、 http://msdn.Microsoft.com/en-us/library/cc949109.aspx を参照してください。

これらは排他的な選択肢ではありませんが、少なくとも、データベースからBLOBを格納して読み取るのではなく、ファイルシステムベースのスキームを使用することでパフォーマンスが向上するという事実から、オプション#1をお勧めします。 。

5
Jesse C. Slicer

システムフォルダに画像を保存するのが最善の方法だと思います。
ご存知のDBおよびクエリを使用すると、過負荷が発生し、DBトランザクションが通常重くなり、サーバーにより多くのストレスがかかる可能性があります。
画像をフォルダに保存し、URLをDBに配置するだけで、アプリの読み込みに適しています。
ただし、DBの利点は、イメージをバックアップできることです。


私の提案:画像をフォルダに保存します。唯一の必要性は、システムI/O操作について知ることです。

4
Mehdi

私が一般的に使用するアプローチは、画像をフォルダーにコピーし、相対URLをデータベースに保持することです。このアプローチの欠点は、誰かが画像を削除した場合、ページをレンダリングするたびにチェックしない限り、Webページに「画像が見つかりません」という結果になることです。

3
Steve

AFAIK、flickr.comは、dbに保存されている参照、メタデータなどとともに、フォルダー/ファイルサーバーにも対応しています。 flickrアーキテクチャ を参照してください

3
mhd

私のサイトにも同じ質問がありました。データベースを使用する場合、写真のみをバックアップする場合はデータベース全体をバックアップする必要があるため、フォルダー実装を使用することにしました...一方、ディレクトリ構造を維持し、簡単にバックアップを作成できます。

よろしくお願いします。

2
MRFerocius

フォルダーを使用する利点は、データベースからそれらのBLOBをフェッチして通常のストリームに変換するカスタムハンドラーを用意する必要がないことです。また、さまざまな場所からホストする方が簡単で、データベースサーバーの負担を回避できます。

パス名の保存には注意する必要があります。相対パス名はURLとしてより適切に機能し、それらを保存する場所、それらを提供する方法などである程度の柔軟性とスケーリングを可能にします。

2

私は両方に行きます。

まず、すべての画像をBLOB列としてデータベースに保存します。そうすることで、イメージが常にデータベースのバックアップに含まれるので安心できます(そうすることを前提としています)。

次に、ファイルをフォルダーにコピーします。そうすることで、毎回データベース(画像ファイル)にクエリを実行する必要がなくなります。フォルダだけに保存​​すると、次のような影響があります。

  • ディスクが破損したためにファイルが失われました
  • ファイルはバックアップ操作に含まれていません

これまでのところ、すべてのお客様のプロジェクトは同じアプローチを採用しており、さまざまな問題が発生していますが、アップロードされたファイルが失われることはありません。 (100GBを超えるアップロードされたドキュメントについて話しています)。

以下を確認することをお勧めします。

  1. ファイルが更新/置換されるときはいつでも、データベースとフォルダの両方でそれを行うようにしてください。そうしないと、一貫性がなくなります。
  2. ファイルの情報を格納するために、別のテーブルが必要になる場合があります。通常、次のものを保存することをお勧めします:(1)ファイル名(2)ファイルタイプ(3)ファイルサイズ/ mimeタイプ
  3. データを格納するテーブルを分割することをお勧めします。テーブルが2GBに達したら、別のテーブルを作成します。適切に設計されていれば、適切なテーブルを見つけるのに問題はありません。

お役に立てれば。

2
uuɐɯǝʃǝs