画像を保存するとき (画像がたくさんある場合)、データベースに BLOB として保存しますか?それともファイルとして保存しますか? なんで?
11 に答える
画像のサイズによって異なります。
Microsoft Research には、この件に関する興味深い文書があります。
データベース (SQL Server および MySQL) を使用して中 (< 5mb) ファイルを保存しようとしましたが、多くの問題が発生しました。
1) 一部の DB (SQL Server Express) にはサイズ制限があります。
2) 一部の DB (MySQL) は致命的に遅くなります。
3) オブジェクトのリストを表示する必要がある場合、誤って SELECT * FROM table を実行すると、大量のデータがデータベースから上下に移動しようとし、応答が非常に遅くなったり、メモリが失敗したりします。
4) 一部のフロントエンド (ruby ActiveRecord) では、ブロブの処理に非常に大きな問題があります。
ファイルを使用するだけです。それらをすべて同じディレクトリに保存しないでください。何らかの手法を使用して複数のディレクトリに配置し (たとえば、GUID の最後の 2 文字または int ID の最後の 2 桁を使用できます)、パスを db に保存します。
データベース サーバーのパフォーマンス ヒットは重要な問題です。ファイル システムのパフォーマンス上の利点が必要な場合は、最初の要求でそこにキャッシュするだけです。後続のリクエストは、直接リンクによってファイル システムから直接提供できます (Web アプリの場合は、出力バッファーをフラッシュする前に HTML を書き換えることができます)。
これにより、両方の長所が提供されます。
- オーソリテイティブ ストアはデータベースであり、トランザクションと参照の整合性を維持します。
- データベースを展開するだけで、すべてのユーザー データを展開できます
- このキャッシュを空にすると (たとえば、Web サーバーを追加することによって)、キャッシュが自動的に補充される間、パフォーマンスが一時的に低下するだけです。
常に変化しないもののためにデータベースを絶えず叩く必要はありませんが、重要なことは、ユーザーデータがすべてそこにあり、さまざまな場所に散らばっていないことです。これにより、マルチサーバーの運用と展開が完全に混乱します. 私は常に「データベースをユーザー データ ストアとして使用する」アプローチを推奨しています。これは、その方がアーキテクチャ的に優れており、効果的なキャッシングで必ずしも遅くならないためです。
そうは言っても、ファイル システムを信頼できるストアとして使用する正当な理由は、ファイル システムにアクセスするために外部の独立したツール (SFTP など) を実際に使用する必要がある場合です。
1 つの Web サーバーで実行していて、今後も 1 つの Web サーバーでしか実行しない場合は、それらをファイルとして保存します。複数の Web ヘッドで実行している場合は、画像の参照インスタンスをデータベースに配置し、BLOB
それをファイルとして Web ヘッドにキャッシュします。
名前、簡単な説明、作成日、作成者などと一緒に画像を保存する場合は、データベースに保存する方がよい場合があります。そうすれば、すべてが一緒です。この同じ情報を保存し、画像をファイルとして保存した場合、「画像オブジェクト」全体を 2 つの場所から取得する必要があります...そして、途中で同期の問題が発生する可能性があります (一部の画像が見つからない)。 . うまくいけば、これは理にかなっています。
保存するとは、それらを使用して Web ページなどに表示することを意味しますか? その場合、より良いオプションはファイルを使用することです.データベースを使用すると、写真のリクエストで絶えず叩かれます. そして、それはあまりうまくスケーリングできない状況です。
問題は、アプリケーションが BLOBS や他のファイルを他のアプリケーション データと同様に処理するかどうかです。ユーザーは他のデータと一緒に画像をアップロードしますか? その場合、BLOB をデータベースに格納する必要があります。これにより、データベースのバックアップが容易になり、問題が発生した場合にトランザクション的に一貫性のある状態に回復することが容易になります。
しかし、ユーザー データではなく、アプリケーション インフラストラクチャの一部である画像を意味する場合、おそらく答えはノーです。
ブロブはデータベース/スクリプトに負担がかかる可能性があります。パスを保存するだけではどうですか。これまで BLOB を使用してきた唯一の理由は、マージ レプリケートが必要な場合、またはアセットの非常に厳しいセキュリティが必要な場合です (ログインしない限りイメージをプルできないなど)。