画像をデータベースに入れることの長所。
トランザクション。BLOB を保存すると、他の DB データと同じようにコミットできます。つまり、関連するメタデータのいずれかと一緒に BLOB をコミットでき、2 つが同期していることを確認できます。ディスク容量が不足したら?コミットなし。ファイルが完全にアップロードされませんでしたか? コミットなし。愚かなアプリケーションエラー?コミットなし。画像とそれに関連するメタデータの一貫性を維持することがアプリケーションにとって重要である場合、DB が提供できるトランザクションは恩恵となる可能性があります。
1 つのシステムで管理できます。メタデータと BLOB をバックアップする必要がありますか? データベースをバックアップします。それらを複製する必要がありますか? データベースを複製します。部分的なシステム障害から回復する必要がありますか? DB をリロードし、ログをロールフォワードします。DB が一般的にデータにもたらすすべての利点 (ボリューム マッピング、ストレージ制御、バックアップ、レプリケーション、復旧など) は、BLOB にも当てはまります。一貫性が向上し、管理が容易になります。
安全。データベースには、活用できる非常にきめ細かいセキュリティ機能があります。スキーマ、ユーザー ロール、さらにはデータのサブセットへの安全なアクセスを提供するための "読み取り専用ビュー" など。これらの機能はすべて、ブロブを保持するテーブルでも機能します。
集中管理。#2に関連していますが、基本的にDBAは(十分な力がないかのように)データベースという1つのことを管理します。最新のデータベース (特に大規模なもの) は、複数のマシンにまたがる大規模なインストールで非常にうまく機能します。単一の管理ソースにより、手順が簡素化され、知識の伝達が簡素化されます。
最新のデータベースのほとんどは、ブロブを問題なく処理します。データ層での BLOB のファースト クラス サポートにより、DB からクライアントに BLOB を簡単にストリーミングできます。ブロブ全体を一度に「吸い込む」ことができる操作がありますが、その機能が必要ない場合は使用しないでください。DB の SQL インターフェイスを調べて、その機能を活用してください。それらをモノリシックに処理される「大きな文字列」のように扱い、BLOB をメモリを大量に消費し、キャッシュを破壊する爆弾に変える理由はありません。
画像専用のファイル サーバーをセットアップできるように、データベースに専用の BLOB サーバーをセットアップできます。専用のディスク ボリューム、専用のスキーマ、専用のキャッシュなどを提供します。DB 内のすべてのデータは同じではないか、同じように動作します。すべて同じように構成する理由はありません。優れたデータベースには、細かいレベルの制御があります。
DB から BLOB を提供する際の主な問題は、HTTP レイヤーが実際にすべての HTTP プロトコルを活用してサービスを実行することです。
多くのナイーブな実装は、単純に blob を取得し、それらをソケットに大量にダンプします。ただし、HTTP には、画像のストリーミングなどに適した重要な機能がいくつかあります。特に、キャッシュ ヘッダー、ETag、およびクライアントが BLOB の「断片」を要求できるようにするためのチャンク転送があります。
HTTP サービスがこれらすべての要求を適切に受け入れていることを確認してください。そうすれば、DB は非常に優れた Web 市民になることができます。HTTP サーバーによるサービスのためにファイルシステムにファイルをキャッシュすることにより、これらの利点のいくつかを「無料で」得ることができます (良いサーバーはとにかく「静的」リソースに対してそれを行うため)。画像の変更日などを尊重します。
たとえば、2009 年 1 月 1 日に作成された画像である spaceshuttle.jpg をリクエストしたとします。この画像は、2009 年 2 月 1 日のようなリクエスト日にファイル システムにキャッシュされます。その後、画像はキャッシュから消去されます (FIFO ポリシー)。 、または何でも)、その後、2009 年 3 月 1 日に誰かが再度要求します。さて、作成日が実際には 1 月 1 日だったにもかかわらず、現在は 2009 年 3 月 1 日の「作成日」になっています。実際には変更されていないのに、サーバーはリソースが変更されたと見なすため、変更されたヘッダーは実際に必要な量よりも多くのデータを取得している可能性があります。
キャッシュの作成日を実際の作成日と同期させておくと、これはあまり問題になりません。
しかし重要なのは、「良き Web 市民」になるためには、問題全体について熟考し、あなたとあなたのクライアントの帯域幅などを節約できる可能性があるということです。
DB からビデオを提供する Java プロジェクトについて、これをすべて実行しましたが、すべてうまくいきます。