web-dev-qa-db-ja.com

画像をデータベースに保存しますか、それともデータベースリンクのあるファイルに保存しますか?

画像ファイルをデータベースに保存することは適切ですか?または、ファイル自体をサーバーに保持しながら、ファイルのパスのみをデータベースに保存する方が良いでしょうか?

これを正しく行うための他の方法はありますか?

22
LostMohican

画像はデータベースではなくファイルシステムに保存することを強くお勧めします。

データベースに画像を保存することにはいくつかの欠点があります:

  • データベースが予期せず大きくなる可能性があります。時々スペースが問題になります。たとえば、SQLServer Expressでは4GBの制限があります。

  • たとえばSQLServerからOracleに切り替えると、データの移行が面倒になる可能性があります。

  • クエリが非常に遅くなる可能性があり、データベースの負荷が高くなります

  • 他のアプリケーションとの相互運用性は、イメージがファイルシステム上にあり、他のアプリケーションが別のデータベースを使用している場合に優れています。それらに直接アクセスすることもでき、データベースツールは必要ありません。

  • 一般にパフォーマンスが悪い

  • とにかくデータベースから画像を取得するときは、おそらく一時ファイルを作成する必要があります。それは不要です。

これらの欠点は、データベースに保存されている画像へのパスをファイルシステムと同期させておくコストをはるかに上回ります。画像をデータベースに保存する方が良い特別な場合はほとんどありません。

22
Falcon

SQL Server 2005とNTFSファイルシステム(Microsoft)を調査して、CRUDのパフォーマンスを比較します。 BLOBへの変換の有無 。この調査は、Webアプリケーションでも行われました。別のデータベース(MySQL)をリストアップしましたが、PHPサイトにWindows Serverを使用していないと想定します。そのため、別のテクノロジーについて同様の調査を行った人がいると興味深いでしょう。

ファイルのサイズに依存することがわかります。 SQL Serverは256K以下のblob(2倍以上)を優先し、ファイルシステムは1MB +のファイルを優先します。この調査のファイルシステムは断片化をデータベースよりも適切に処理するため、これらのファイルを絶えず更新している場合や、このシステムが時間とともに成長する場合、断片化はファイルシステムがより適切に機能する大きな要因になります。

これらのファイルを維持するためにサイトがどの程度責任があるかを判断する必要があります。保険金請求エージェントが事故の写真をアップロードするサイトを構築している場合は、トランザクションを制御し、それらのファイルがサーバー上にあることを確認してください。良いデータベースはこれをあなたに代わってやってくれるので、開発者としてあなたはプレッシャーを加えました。

設計時には、レプリケーション、バックアップ、ディザスタリカバリ、断片化、残りのディスク容量、および長期にわたるパフォーマンスを考慮する必要があります。これは、以前のバージョンのSQL Serverに関する研究の1つにすぎません。他のデータベースメーカーと同様に、大きなファイルとバイナリの処理は、主要な競争分野だと思います。

11
JeffO

膨大な数のイメージを作成する場合、それらをデータベースに保存すると、ファイルシステムレベルでiノードが不足する問題が解消される可能性があります。

ただし、この問題を解決するには、より適切なファイルシステムを使用することと、組織上でそのファイルシステムに推奨される対策を講じることが最善です。

そうでなければ、データベースに画像を保存することは、リソースの完全な無駄になります。あなたが言ったようにパスを保存します。

4
Jonno