web-dev-qa-db-ja.com

画像をBLOBに保存するか、URLだけに保存​​する方が良いですか?

可能性のある複製:
ファイル-データベース内かどうか

データベースでblobフィールドを引き続き使用するのに十分な理由があるかどうか疑問に思っていました。数年前に大量の画像が含まれるDBを操作しましたが、DBが非常に遅く、画像をDB内に保持する理由が見当たらないため、画像を取り出してファイル名を保存しました代わりに。

これは賢明な動きでしたか?あなたは私の代わりに何をしますか?

38
eiefai

他の答えからわかるように、これは大きな「それは依存する」です。他のいくつかの要因は、ホスティングに料金を支払っている場合、ファイルストレージまたはデータベースストレージに追加料金がかかるかどうかです。ファイルストレージは、特にクラウドサービスの場合、通常は安価です。

自己ホスト型でSQL Serverを使用している場合、次期バージョンのコードネームDenaliは 拡張FILESTREAM になり、TSQLとファイルシステムの両方を介してアクセスできるようになります。また、これらが同期していることを確認します。どちら側からでもアクセス、更新、削除でき、すべてが整理された状態に保たれます。

あなたの研究を行い、あなたにとって何が重要であるかを見つけ、その選択に基づいて方向性を選んでください。

BLOBを使用する理由は、管理のしやすさです。データベースをバックアップおよび復元する方法は1つだけで、増分バックアップを簡単に実行できます。DBテーブルに保存されているイメージとそのメタデータが同期しなくなるリスクはありません。 、クエリを実行したり、画像を読み込んだり保存したりするための1つのプログラミングインターフェイスもあるので、リモートクライアントにファイルシステムへのアクセスを与える必要がなく、同じGRANTが画像とその関連データに適用されることを知っています。さらに、ストレージ管理には1つの方法があります(たとえば、OracleではすべてをASMに配置し、すべてのLVMとしてOracleを使用できます)。

別のアプリケーションは、リレーショナルデータをシリアル化されたオブジェクトと混合することです(BLOBは任意のバイナリにすることができ、イメージである必要はありません)。または、リレーションデータおよびBLOBのバイトx-y(ファイルヘッダーなど)に対してクエリを実行できます。アプリケーションは実際には無限です。

BLOBへのアクセスがファイルシステムへのアクセスよりも遅い場合は、データベースが正しく構成されていない可能性が高いです。

17
Gaius

私はblobを使用しません-ほとんどの場合、バックアップと復元の観点からです。これは、blobデータがバックアップの速度を低下させたくないためです。

私は完全なURLを保存しませんが、特定のポイントの下にファイルパスのみを保存し、パスを作成します。これは、ユーザーとプログラムがファイルにアクセスする方法が複数あるためです(FTP、HTTP、ローカルディレクトリ、 NFSマウントされたディレクトリ)。

...もちろん、私はほとんどの人よりも多くの画像を扱います...私のデータセットの1つは、1日あたり約700GBの画像(圧縮)を取得します。しかし、それらの画像のサムネイルでさえ、私はまだ外部に保存しています。

13
Joe

私はデータベースに画像の「参照」コピーを保存するのが大好きです。管理性/災害復旧の観点から、これは実際に飛ぶ方法です。

これで、ほとんどのアプリケーションでファイルシステムからイメージを提供するために多くのことを行うことができるため、データベースサーバー自体にそれほど望まないことを実行するようにプレッシャーをかけることはありません。

8
Wyatt Barnett

Linuxで作業している場合、データベースではなくファイルシステムに画像を保存すると、パフォーマンスが大幅に向上します。BradEdigerの本の この抜粋 を参照してくださいAdvanced Rails

8
j.p.

データベースに画像を保存するのはあまり好きではありません。ユーザー数が少ない小さなアプリでは、それは簡単な解決策のように見えますが、スケーリングを開始すると、状況がさらに難しくなります。

私の好みは、Webサーバー上のフォルダーへの画像の保存を開始することですが、必要なときに、専用の最適化された画像サーバーにすばやく移動できるように、パスを簡単にアクセスできる構成に保持します。後で、同じ方法でそれらを別の場所(S3またはAkamaiなど)に移動したいと思うかもしれません。それらをデータベースから読み取ることを期待していたコードを変更する必要がある場合、これらすべてははるかに複雑になります。

5
phred

これは賢明な動きでしたか?

それが賢明な動きであったかどうかは、特定のケースによって異なります。

ファイルの場所がURL構造に直接影響している場合、またはデータベースに完全なファイルアドレスを格納している場合(悪い)、誰かがディレクトリを移動したり名前を変更したりすると問題が発生するため、これは悪い移動であったと言えます。

しかし、アプリケーションがファイルディレクトリをポイントする必要がある方法でビルドされていて、ファイルアクセスロジックが動的である場合は、次の理由により賢明な移動を行います。

  • データベースの格納では、リクエストごとに多数の画像を提供する必要がある場合、ファイルがネットワークに同期して送信されるため、アプリケーションの応答時間が長くなります。また、サーバーにもう少し処理を追加します。

  • ファイルの保存は通常、データベースの保存よりも安価です。

  • ファイルの保存では(画像へのアクセスに制限がない限り、特定のユーザーのみが特定の画像グループにアクセスできます)、画像やその他の種類のファイルにアクセスするための処理は必要ありません。

  • データベースストレージでは、FTPを使用してファイルにアクセスすることはできません(かなり明白ですが、覚えておくことをお勧めします)。

  • データベースファイルの保存は、データベースの定期的なバックアップの速度を低下させたり混乱させたりします。

あなたは私の代わりに何をしますか?

反対の支配的な要因が現れない限り、私はその決定を続けます。

お役に立てば幸いです。

4
marcio