画像をDBに保存する-いいですか、いいですか


415

そのため、DBに画像を大量に保存するアプリを使用しています。これについてどう思いますか?私は、DBに直接保存するよりも、ファイルシステムに場所を保存するタイプです。

長所/短所は何だと思いますか?


回答:


350

何TBもの画像を管理するいくつかのアプリケーションを担当しています。データベースへのファイルパスの保存が最適であることがわかりました。

いくつかの問題があります:

  • データベースストレージは通常、ファイルシステムストレージよりも高価です。
  • 標準の既製品を使用して、ファイルシステムアクセスを超高速化できます。
    • たとえば、多くのWebサーバーはオペレーティングシステムのsendfile()システムコールを使用して、ファイルシステムからネットワークインターフェースに直接非同期でファイルを送信します。データベースに保存された画像は、この最適化の恩恵を受けていません。
  • Webサーバーなどのものは、ファイルシステムの画像にアクセスするために特別なコーディングや処理を必要としません。
  • データベースは、画像とメタデータの間のトランザクションの整合性が重要な場所で勝っています。
    • dbメタデータとファイルシステムデータ間の整合性を管理する方が複雑です
    • (Webアプリケーションのコンテキスト内で)データがファイルシステムのディスクにフラッシュされたことを保証することは困難です。

33
ファイルシステムを "超高速化"するために、市販の製品にはどのようなものがありますか?
AndreiRînea2008年

22
私は3TBのファイルしか管理していませんが、私は間違いなく同意します。データベースは、ブロブではなく構造化データ用です。
derobert 2009年

7
@derobert:結局のところ、クエリでデータ要素を条件としても結合としても使用しない場合は、おそらくデータベースに属していません。次に、画像に類似性を照会するための優れたデータベース関数がある場合...
Nils Weinander 09年

14
ファイルシステムを "超高速化"するために、市販の製品にはどのようなものがありますか?
ablmf 2009

5
Re:「超高速」製品:ほとんどのWebサーバーは、sendfile()システムコールを利用して、静的ファイルを非同期でクライアントに配信できるようになりました。ファイルをディスクからネットワークインターフェイスに移動するタスクをオペレーティングシステムにオフロードします。OSはこれをはるかに効率的に行うことができ、カーネル空間で動作します。これは、私にとって、ファイルシステムとイメージの格納/提供のdbにとって大きなメリットのようです。
アランドネリー

140

ほとんどの問題と同様に、思ったほど簡単ではありません。画像をデータベースに保存することが理にかなっている場合があります。

  • 動的に変化する画像、たとえば請求書を保存していて、2007年1月1日のように請求書を取得したいですか?
  • 政府はあなたに6年の歴史を維持することを望んでいます
  • データベースに保存された画像は、別のバックアップ戦略を必要としません。ファイルシステムに保存された画像は
  • 画像がデータベース内にある場合、画像へのアクセスを制御する方が簡単です。アイドル管理者は、ディスク上の任意のフォルダーにアクセスできます。画像を抽出するためにデータベースを覗き見するには、本当に断固とした管理者が必要です

一方、関連する問題があります

  • 画像を抽出してストリーミングするには追加のコードが必要
  • 待ち時間は、直接ファイルアクセスよりも遅い場合があります
  • データベースサーバーの負荷が高い

2
オンプレミスにインストールされているアプリケーション(SharePointなど)を作成する場合、個別のバックアップ戦略がないことは大きな問題になる可能性があります。SharePointバックアップを作成すると、すべてがDBにあるため、非常に簡単です。
Eric Sc​​hoonover、

44
あいまいさによるセキュリティは、実際にはアクセス制御戦略ではありません。
Jon Cage

5
私は彼が曖昧さによってセキュリティを主張しているとは思わない-彼はDBに画像を置くことはセキュリティの別の層を追加すると言っている。(私は思います... @コンラッド、口に言葉を入れたくない)
AJ。

バックアップが1つしかない(または、より一般的には、すべてのデータが1か所にある)ため、データベースにイメージを保存することを選択しましたが、あなたが言及した問題も真実であるため、イメージをファイルシステムにキャッシュしています。それは両方の世界で最高であり、ここでトップの回答のどれもそれについて言及していないことに驚いています。
Bart van Heukelom、2011年

偶然、ImageResizing.Netライブラリを使用してSQL-> disk imageキャッシュを処理していますか?これは、入手可能な最も高度でスケーラブルな堅牢なディスクキャッシュです...
Lilith River


56

これは少し長いショットかもしれませんが、SQL Server 2008を使用している(または使用を計画している)場合は、新しいFileStreamデータ型を確認することをお勧めします。

FileStreamは、DBへのファイルの保存に関する問題のほとんどを解決します。

  1. Blobは実際にはファイルとしてフォルダーに保存されます。
  2. BLOBは使用してアクセスすることができるいずれかのデータベース接続ファイルシステム上にあります。
  3. バックアップが統合されています。
  4. 移行は「うまくいく」。

ただし、SQLの「透過的データ暗号化」はFileStreamオブジェクトを暗号化しないため、それが考慮事項である場合は、varbinaryとして格納するだけの方がよい場合があります。

MSDN記事から:

Transact-SQLステートメントでは、FILESTREAMデータを挿入、更新、クエリ、検索、およびバックアップできます。Win32ファイルシステムインターフェイスは、データへのストリーミングアクセスを提供します。
FILESTREAMは、NTシステムキャッシュを使用してファイルデータをキャッシュします。これにより、FILESTREAMデータがデータベースエンジンのパフォーマンスに与える影響を軽減できます。SQL Serverバッファープールは使用されません。したがって、このメモリはクエリ処理に使用できます。


FileStreamの+1。実際にはblobをファイルとしてディスクに保存しますが、トランザクションとして管理します。
John Gietzen、2011

また、SQLサーバーでは、FileStreamブロブがディスクから直接アクセスできるため、DB接続の
占有

それでも、DBとWebサーバー間のレイテンシが追加されます...そして、ディスクキャッシュを使用している場合を除き、Webサーバーはディスクにストリーミングするのではなく、メモリにロードしてクライアントにストリーミングする必要があります。
リリス川

39

DB内のファイルパスは間違いなく進むべき道です。TBの画像を使用しているお客様から、DBに大量の画像を保存しようとすると悪夢になるという話を何度も耳にしました。パフォーマンスヒットだけでは大きすぎます。


35

私の経験では、最も簡単な解決策は、主キーに従って画像に名前付けることです。そのため、特定のレコードに属する画像を簡単に見つけることができ、その逆も同様です。しかし、同時に、画像についてはデータベースに何も保存していません。


とてもいいですね。ユーザーはファイル名を簡単にインクリメントして他のファイルにアクセスできるようになりました...
Marijn Huizendveld

6
@Marijn:画像を世界に公開する場合のみです。
Seun Osewa 2010年

画像化されたドキュメントと非常によく似た処理を行いましたが(主キーは3つの項目の複合キーです)、同じディレクトリに複数のバージョンを含めることができるように、ドキュメントがスキャンされた日時を追加しました。
Andrew Neely、2011

@大瀬和、どう?はい、ファイルに直接アクセスするには、エンドユーザーがフォルダにアクセスする必要があります。リクエストに基づいてFTP経由でファイルを提供するプロセスがあり、セキュリティはSQLサーバーと同等です。
Andrew Neely、2011

31

ここでの秘訣は熱狂者にならないことです。

ここで注意すべき点の1つは、プロファイルシステムキャンプの誰も特定のファイルシステムをリストしていないことです。これは、FAT16からZFSまでのすべてのものがすべてのデータベースに勝るとも劣らないことを意味しますか?

番号。

真実は、私たちが生の速度だけを話しているときでさえ、多くのデータベースが多くのファイルシステムを打ち負かすということです。

正しい行動方針は、正確なシナリオに対して正しい決定を行うことです。そのためには、いくつかの数値といくつかのユースケースの見積もりが必要になります。


6
ファイルシステムがDBよりも100%高速であると主張している人はいません(Mark Harrisonの回答を参照)。それはちょっとしたことです。おそらく、シートベルトを着用しない方がよい場合もありますが、一般的には、シートベルトを着用することをお勧めします。
カルバン、

30

参照整合性とACIDコンプライアンスを保証する必要がある場所では、データベースに画像を保存する必要があります。

データベースに保存されている画像とその画像に関するメタデータが同じファイルを参照していることをトランザクションで保証することはできません。言い換えると、ファイルシステム上のファイルがメタデータと同時に同じトランザクションでのみ変更されることを保証することは不可能です。


7
実際には、できません。画像ファイルが作成後に削除、変更、上書きされない限り、トランザクションをコミットする前にすべての画像ファイルが同期され、ファイルシステムの破損はありません。画像ファイルとメタデータが同期していることを確認できます。一部のアプリケーションでは、それらは多すぎると思います。
Seun Osewa 2010年

さらに進んで、ジャーナリングファイルシステムといくつかの追加のプログラムロジックを使用して、ACIDコンプライアンスを達成できると言います。手順は、dbレコードの書き込み、ファイルの書き込みです。ファイルがコミットする場合は、dbトランザクションをコミットします。
Andrew Neely

28

他の人が言ったように、SQL 2008にはFilestreamタイプが付属しているため、dbにファイル名または識別子をポインターとして保存し、ファイルシステムにイメージを自動的に保存できます。

古いデータベースを使用している場合、それをblobデータとして保存していると、機能の検索方法でデータベースから何も取り出せなくなるので、おそらく最良の方法です。ファイルシステムにアドレスを保存し、その方法でイメージを保存します。

この方法では、ファイルシステムのスペースを正確に保存するだけで、ファイルシステムのスペースも圧縮するだけなので、ファイルシステムのスペースも節約できます。

また、dbヒットなしでファイルシステム内の未加工画像を参照できるようにするいくつかの構造または要素を使用して保存するか、ファイルを別のシステム、ハードドライブ、S3または別のシナリオに一括転送することもできます。プログラムを使用しますが、構造を維持します。ストレージを増やしようとするときに、イメージをdbから取り出そうとすることはありません。

おそらく、それはまた、あなたがあなたのウェブエンジン/プログラムに一般的にヒットする画像URLに基​​づいていくつかのキャッシング要素を投げることを可能にするでしょう、それであなたもそこにあなた自身を保存しています。


27

頻繁に編集されない小さな静的画像(数メガ以下)は、データベースに保存する必要があります。この方法には、移植性(データベースと一緒に画像が転送される)、バックアップ/復元が簡単(データベースと一緒に画像がバックアップされる)、スケーラビリティ(数千の小さなサムネイルファイルを含むファイルシステムフォルダーがスケーラビリティの悪夢のように聞こえる)などのいくつかの利点があります。私)。

データベースから画像を提供するのは簡単です。DBサーバーから返されたバイト配列をバイナリストリームとして提供するhttpハンドラーを実装するだけです。


頻繁に編集されるファイルにはデータベースが適していると私は主張します。その場合、一貫性が問題になる可能性があるためです。
Seun Osewa 2010年

26

このトピックに関する興味深いホワイトペーパーを次に示します。

BLOBを使用するかしないか:データベースまたはファイルシステムのラージオブジェクトストレージ

答えは「場合によります」です。確かに、データベースサーバーとBLOBストレージへのアプローチに依存します。また、blobに格納されているデータのタイプ、およびそのデータへのアクセス方法にも依存します。

小さいサイズのファイルは、データベースをストレージメカニズムとして使用して効率的に格納および配信できます。大きなファイルは、特に頻繁に変更/更新される場合は、ファイルシステムを使用して保存するのが最適です。(ブロブの断片化は、パフォーマンスに関して問題になります。)

ここで、覚えておくべき追加のポイントがあります。BLOBを格納するためのデータベースの使用をサポートする理由の1つは、ACIDへの準拠です。ただし、ホワイトペーパー(SQL Serverの一括ログ記録オプション)でテスターが使用したアプローチでは、SQL Serverのスループットが2倍になり、blobデータがログに記録されなかったため、ACIDの「D」が「d」に効果的に変更されました。トランザクションの最初の書き込み。したがって、システムの完全なACIDコンプライアンスが重要な要件である場合は、ファイルI / OとデータベースBLOB I / Oを比較するときに、データベース書き込みのSQL Serverスループット値を半分にします。


25

まだ誰も言及していないが、注目に値することの1つは、ほとんどのファイルシステムに大量の画像を保存することに関連する問題があることです。たとえば、上記のアプローチを採用し、各画像ファイルに主キーにちなんで名前を付けた場合、ほとんどのファイルシステムでは、非常に多数の画像に到達したときにすべての画像を1つの大きなディレクトリに配置しようとすると問題が発生します(たとえば、数十万または数百万)。

これに対する一般的な解決策の1つは、それらをサブディレクトリのバランスの取れたツリーにハッシュすることです。


あなたはそう思うでしょうが、問題は実際には軽微です。1つのディレクトリに数百万のファイルがあり、何百人ものユーザーが問題なくアクセスできるアプリがあります。スマートではありませんが、機能します。最大の問題は、エクスプローラーを使用してディレクトリを参照する場合、懐中電灯を永遠に見ることです。
SqlACID 2008年

1
大規模なディレクトリで問題のないファイルシステムを使用することをお
勧めします

8
私は1つのディレクトリ(RHEL 4を実行しているサーバー)に数百万のファイルを含むアプリを持っていました。現在、それらはデータベースにあります。非常に簡単に移動またはバックアップできる単一のファイルがあります。
リチャード

1
@Seun Osewa:すべてのファイルシステムには制限があります。同じディレクトリに何百万ものエントリを保存するのに問題がないファイルシステムをご存じの場合は、お知らせください。
Guillaume

1
@Seun Osewa:データベースは現在最大28GBで、540万のレコードがあります。結局、データベーステーブルをパーティション分割して、約5 GBのサイズのファイルをいくつかバックアップする必要がありました。個々のイメージをAmazon S3に移動すると、ファイル名をDBに保存するだけで済みます(Amazonはバックアップを実行できます) )
リチャード

22

誰も言及していないことは、DBがアトミックアクション、トランザクションの整合性を保証し、同時実行性を扱うことです。参照整合性でさえ、ファイルシステムではウィンドウの外にあります。ファイル名が本当に正しいことをどのようにして知るのでしょうか。

ファイルシステムに画像があり、新しいバージョンを書き込んだり、ファイルを削除したりしているときに誰かがファイルを読み取っている場合-どうなりますか?

管理(バックアップ、レプリケーション、転送)も簡単なので、ブロブを使用します。彼らは私たちにとってうまくいきます。


特定の画像に対して2つの同時更新がある可能性はどれくらいですか?
アラファンギオン2009

1
問題が発生するのに同時更新は必要ありません。読み取りと書き込みのどちらでもかまいません。私たちの場合、これが起こることがほぼ保証されています。
ドラえもん2009

20

画像へのファイルパスのみをデータベースに保存する場合の問題は、データベースの整合性を強制できなくなることです。

ファイルパスが指す実際のイメージが使用できなくなると、データベースに無意識のうちに整合性エラーが発生します。

画像が求められている実際のデータであり、ある種のファイルシステムとインターフェースする必要がない(ファイルシステムが独立してアクセスされている場合)画像が突然「消える」可能性があります)、BLOBなどとして直接保存します。


17

私が働いていた会社では、1億5500万枚の画像をOracle 8i(当時は9i)データベースに保存していました。7.5TB相当。


5
もちろんです。どうやら、データベースは今でははるかに大きくなっています。データベースにデータがあると、別のサイトでデータベースを複製するのも簡単になります。
graham.reeds 2009年

私はOracleがファイルシステムをデータベースに実際にマウントできるデモンストレーションを見ました。これがあなたがしたことかどうか知っていますか?(申し訳ありませんが、オラクルには無知なので、たぶんゴミの話をしています。)
Stu Thompson

私はそうは思いません-それはデータベースとしてデータベースに画像を保存することでした。データベースは積極的に調整されました。フィールドが追加されたり削除されたりすると、画像のサイズが変化することについて何度も話し合ったことを覚えています。すべてが境界整列されました。
graham.reeds 2009

14

通常、私はインフラストラクチャの一部(データベース)を拡張するのに最も費用がかかり、最も困難なものを採用し、それにすべての負荷をかけることに反対しています。一方、特に複数のWebサーバーがあり、何らかの方法でデータの同期を維持する必要がある場合は、バックアップ戦略が大幅に簡略化されます。

他のほとんどのものと同様に、それは予想されるサイズと予算に依存します。


13

すべての画像をSQL2005 blobフィールドに格納するドキュメントイメージングシステムを実装しました。現在数百GBあり、応答時間は非常に短く、パフォーマンスの低下はほとんどまたはまったくありません。さらに、規制に準拠するために、新しく投稿されたドキュメントを標準のNTFSファイルシステムとして公開する光学ジュークボックスシステムにアーカイブするミドルウェアレイヤーがあります。

特に次の点に関して、私たちはその結果に非常に満足しています。

  1. レプリケーションとバックアップのしやすさ
  2. ドキュメントのバージョン管理システムを簡単に実装する機能

11

これがWebベースのアプリケーションである場合、AmazonのS3やNirvanixプラットフォームなどのサードパーティのストレージ配信ネットワークに画像を保存することには利点があります。


11

前提:アプリケーションはWeb対応/ Webベースである

誰も本当にこれについて言及していないことに驚いています...専門家である他の人にそれを委任してください-> サードパーティのイメージ/ファイルホスティングプロバイダーを使用してください

次のような有料オンラインサービスにファイルを保存します

ここでこれについて話している別のStackOverflowスレッド。

このスレッドでは、サードパーティのホスティングプロバイダーを使用する理由について説明します。

それはとても価値があります。彼らはそれを効率的に保管します。サーバーからクライアントのリクエストなどにアップロードされる帯域幅はありません。


10

SQL Server 2008を使用しておらず、特定の画像ファイルをデータベースに配置する確かな理由がある場合は、「両方」のアプローチをとり、ファイルシステムを一時キャッシュとして使用し、データベースをマスターリポジトリとして使用できます。 。

たとえば、ビジネスロジックは、提供する前にイメージファイルがディスクに存在するかどうかをチェックし、必要に応じてデータベースから取得できます。これにより、複数のWebサーバーの機能を利用でき、同期の問題が少なくなります。


+1これにより、元の画像を保存し、キャッシュ/最適化されたバージョンを配信しながら、サイズ/圧縮を後で変更することもできます
Deebster

7

これが「現実の世界」の例のどれくらいかはわかりませんが、現在、カードの画像を含むトレーディングカードゲームの詳細を保存するアプリケーションがあります。データベースのレコード数は現在までのところ2851レコードのみですが、特定のカードが複数回リリースされ、代替のアートワークがあるという事実を踏まえると、アートワークの「プライマリスクエア」をスキャンしてから動的にスキャンする方が実際にはサイズがより効率的でした要求されたときにカードの境界線とその他の効果を生成します。

この画像ライブラリの最初の作成者は、リクエストに基づいて画像をレンダリングするデータアクセスクラスを作成し、表示と個々のカードを非常に高速に処理しました。

これにより、新しいカードがリリースされたときの展開/更新も簡単になります。イメージのフォルダー全体を圧縮してパイプに送信し、適切なフォルダー構造が作成されるようにする代わりに、データベースを更新してユーザーに再度ダウンロードしてもらうだけです。現在、これは最大56MBのサイズで、これは素晴らしいことではありませんが、将来のリリースのために増分更新機能に取り組んでいます。さらに、ダイヤルアップを介してダウンロードの遅延なしにアプリケーションを取得できるようにするアプリケーションの「イメージなし」バージョンがあります。

このソリューションは、アプリケーション自体がデスクトップ上の単一のインスタンスとしてターゲットに設定されているため、これまでのところ優れています。このすべてのデータがオンラインアクセス用にアーカイブされているWebサイトがありますが、同じソリューションを使用することは決してありません。ファイルへのアクセスは、画像に対して行われる要求の頻度と量に合わせて拡張できるため、望ましいと思います。

うまくいけば、これはあまり意味のないことですが、私はこのトピックを見て、比較的成功した小規模/中規模アプリケーションから私の洞察を提供したいと思いました。


レプリケーションを処理する場合、データベースにイメージを保存する方がIMOよりはるかに優れています。
ビープビープ音


7

保存する画像の数とサイズによって異なります。私は過去にデータベースを使用して画像を保存しましたが、私の経験はかなり良好です。

IMO、データベースを使用して画像を保存する長所は、

A.画像を保持するためにFS構造は必要ありません
。B。より多くのアイテムを保存する場合、データベースインデックスはFSツリーよりもパフォーマンスが優れています
。C。スマートに調整されたデータベースは、クエリ結果をキャッシュするのに優れています
。また、レプリケーションが設定されていて、コンテンツがユーザーの近くのサーバーから配信されている場合にもうまく機能します。このような場合、明示的な同期は必要ありません。

画像が小さくなり(たとえば64k未満)、dbのストレージエンジンがインライン(レコード内)BLOBをサポートする場合、間接指定が不要なため、パフォーマンスがさらに向上します(参照の局所性が実現されます)。

少数の巨大なサイズの画像を扱う場合、画像を保存することは悪い考えかもしれません。画像をデータベースに保存する際のもう1つの問題は、作成、変更日などのメタデータをアプリケーションで処理する必要があることです。


7

最近、PDF / WordファイルをMySQLテーブルに保存するPHP / MySQLアプリを作成しました(これまでのところ、ファイルあたり最大40MB)。

長所:

  • アップロードされたファイルは、他のすべてと一緒にバックアップサーバーに複製されます。個別のバックアップ戦略は必要ありません(安心)。
  • ウェブサーバーの設定は、uploads /フォルダーを用意する必要がなく、すべてのアプリケーションにその場所を知らせる必要がないため、少し簡単です。
  • データの整合性を向上させるために編集にトランザクションを使用できます-孤立したファイルや欠落しているファイルについて心配する必要はありません

短所:

  • mysqldumpは、いずれかのテーブルに500MBのファイルデータがあるため、非常に時間がかかります。
  • ファイルシステムと比較した場合、全体的にメモリ/ CPU効率はそれほど高くない

私は自分の実装を成功と呼びます。バックアップ要件を処理し、プロジェクトのレイアウトを簡素化します。アプリを使用する20〜30人にとってパフォーマンスは良好です。


6

私の経験では、データベースに保存されている画像と、パスがdbに保存されているファイルシステム上の画像の両方を管理する必要がありました。

最初のソリューションであるデータベース内の画像は、データアクセスレイヤーがデータベースオブジェクトのみを処理する必要があるため、多少「クリーン」です。しかし、これは、少ない数を処理する必要がある場合にのみ有効です。

明らかに、バイナリラージオブジェクトを処理するときのデータベースアクセスのパフォーマンスは低下しており、データベースディメンションは大幅に増大し、再びパフォーマンスが低下します。通常、データベーススペースはファイルシステムスペースよりもはるかに高価です。

一方、大きなバイナリオブジェクトをファイルシステムに保存すると、データベースとファイルシステムの両方を考慮する必要のあるバックアップ計画が作成されます。これは、一部のシステムでは問題になる可能性があります。

ファイルシステムを使用するもう1つの理由は、画像データ(またはサウンド、ビデオなど)をサードパーティのアクセス権と共有する必要がある場合です。現在、私は「外部から」アクセスする必要がある画像を使用するWebアプリを開発しています"バイナリデータを取得するためのデータベースアクセスが単純に不可能になるような方法で私のWebファーム。したがって、選択を促す設計上の考慮事項がある場合もあります。

また、バイナリオブジェクトにアクセスするときに権限と認証を処理する必要がある場合は、この選択を行う際に考慮してください。これらの要件は、通常、データがdbに格納されているときに簡単に解決できます。


4

かつては画像処理アプリケーションに携わっていました。アップロードした画像は、/ images / [今日の日付] / [ID番号]のようなディレクトリに保存しました。ただし、画像からメタデータ(exifデータ)を抽出し、タイムスタンプなどと共にデータベースに保存しました。


4

以前のプロジェクトでは、イメージをファイルシステムに保存していたため、バックアップ、レプリケーション、およびファイルシステムとデータベースとの同期が取れなくなり、多くの問題が発生しました。

私の最新のプロジェクトでは、データベースに画像を保存し、それらをファイルシステムにキャッシュしています。これまで問題はありませんでした。


3

次に、ファイルパスに関する推奨事項。私は、大規模なアセットコレクションを管理する必要があるいくつかのプロジェクトに取り組んできました。物事をDBに直接保存しようとすると、長期的に苦痛と不満が生じました。

それらをDBに格納することに関して私が考えることができる唯一の本当の「プロ」は、個々の画像アセットの容易さの可能性です。使用するファイルパスがなく、すべての画像がDBから直接ストリーミングされる場合、ユーザーがアクセスしてはならないファイルを見つける危険はありません。

それは、Webからアクセスできないファイルストアからデータを取得する中間スクリプトで解決するほうがよいようです。したがって、DBストレージは本当に必要ではありません。


3

通りの言葉は、あなたがあなたのデータベースがそれを行うことができることを証明しようとしているデータベースベンダーでなければ(例えば、MicrosoftがSQL Serverに膨大な画像を保存するTerraserverについて自慢しているとしましょう)それはあまり良い考えではないということです。代替手段-ファイルサーバーへの画像とデータベースへのパスの保存が非常に簡単な場合、なぜ煩わしいのでしょうか。ブロブフィールドは、SUVのオフロード機能のようなものです。ほとんどの人はSUVを使用せず、通常トラブルに巻き込まれ、トラブルを起こす人もいます。


3

画像をデータベースに保存しても、画像データはファイルシステムのどこかに移動しますが、直接アクセスできないように不明瞭になります。

+ ves:

  • データベースの整合性
  • 画像が追加または削除されたときにファイルシステムの同期を保つことを心配する必要がないため、管理が簡単です。

-ves:

  • パフォーマンスの低下-データベースの検索は通常、ファイルシステムの検索よりも遅くなります
  • 画像を直接編集することはできません(トリミング、サイズ変更)

どちらの方法も一般的であり、実践されています。長所と短所を見てください。どちらにしても、欠点を克服する方法を考える必要があります。データベースに保存することは、通常、データベースパラメータを調整し、ある種のキャッシュを実装することを意味します。ファイルシステムを使用するには、ファイルシステムとデータベースの同期を維持する方法を見つける必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.