1

これは設計上の疑問に直面しています。asp.net ページに表示される 1500 枚の画像のコレクションがあります。表示される画像はページごとに異なります。これらの画像の数は、時間の経過とともに増加します。来て、

a.) データベースに画像を保存するのは良い考えですが、データベースから画像を取得するための往復時間が長くなる可能性があります。

b.) ディレクトリにすべてのイメージを配置し、その上に仮想ファイル システムを配置して、アプリケーションがディレクトリからイメージにアクセスするのはよいことですか。

最小のラウンド トリップ時間で画像をフェッチするための従来のデータベースに特に設計戦略はありますか? 従来のデータベースの使用以外に解決策はありますか?

編集 1: 各画像は 12 時間ごとに新しいエントリに置き換えられるため、データベースに保存することは、私が考える限り良い考えではないかもしれませんが、データストアを使用してこれらにインデックスを付けることがどれほど良いでしょうか?画像?

編集 2: はい、アプリケーションをクラスターで実行する予定です。また、データストアを使用する場合 (それが適切なオプションである場合)、C# および ASP.NET と互換性がありますか?

ps: SQL Server を使用してこれらの画像を保存しています。

4

5 に答える 5

2

これまでのコメントはすべて非常に優れています...非常に具体的な要件がないため、オプションを説明するために幅広い一般化を行う必要があります。いくつかの例を次に示します。

  • 生の速度ならが必要な場合は、フラット ファイルが明らかに勝者です。Apache または IIS を使用しているかどうかに関係なく、どちらも静的なファイルベースのコンテンツを非常に高速に提供するように最適化されています。高性能サイトはすべてこれを認識しており、動的処理を念頭に置いてコンテンツの多くを保存しますが、動的コンテンツの一部を選択して「公開」します。静的バージョンで。定期的またはイベント駆動型で Web ファームに送信します。少しオーケストレーションが必要ですが、安価に実行でき、データベース サーバーやバックエンド ネットワークなどの負荷を大幅に軽減できます。簡単な例として、その構造のルートが動的に評価されるフォルダーに公開します。更新を公開する準備ができたら、新しいフォルダーを作成し、ルート パスを変更します。ダウンタイムなし、安価、簡単。関連するメモでは、このすべての情報をバックエンド ストアから取得するには、これらをメモリにロードする必要があります。これは、最終的にガベージ コレクションの時間が長くなることを意味し、その結果、マルチプロセッサ/コア ガーデニングを使用している場合でも、アプリケーションの速度が低下します。

  • 画像を整理/公開する方法を細かく制御する必要がある場合、フォルダーは最適ではない可能性があります。たとえば、個々のユーザーの画像を整理する必要があり、画像に関する多くのメタデータを追跡する必要がある場合は、データベースが適している可能性があります。そうは言っても、これはデータベース管理の観点から多くの課題を提示するため、データベース チームはおそらくあなたを嫌うでしょう。さらに、ORM を使用している場合、これを機能させるのに問題が発生する可能性があり、隠しプロキシ オブジェクトや第 2 レベルのキャッシュなどが原因で、メモリ フットプリントが許容できないレベルに達することがあります。これはすべて軽減できるので、注意してください。アプリケーションのプロファイリングを行っていることを確認してください。そうは言っても、このユースケースには構造化ストア (DB など) の方が理想的です。

  • セキュリティを考慮して...これらの画像が何を表しているかによって、フラット ファイルは必然的に、正規化攻撃、ブラウズ可能なフォルダー構造のブルート フォース列挙、Cookie、URL、viewstate の再生などに関する懸念につながります。または、ファイルシステムのセキュリティ制約を論理的/コンテキスト的なセキュリティ制約にマップする必要があるため、フラット ファイルを使用するクレーム ベースのセキュリティ モデルは多少面倒になります。このような問題により、構造化されたストアを好むことがよくあります。

前述のキャッシュのアイデアは優れたものであり、実際にデータベースにアクセスする頻度に関して中間点を作成するのに役立ちますが、メモリ消費や GC などに関連する懸念には役立ちません...ただし、余裕があれば、バッキング ストアをサポートするキャッシュ/グリッドの方がはるかに優れています (例: NCache、ScaleOut など)。これらは優れたスケーラビリティ/冗長性を提供し、セッション状態、ビューステートなどのストレージをオフロードするためにも使用できます。

お役に立てれば。

于 2010-05-14T18:04:38.363 に答える
1

データベースに画像を保存するのではなく、正しい画像へのリンク (パス/ファイル名/ID など) を保存するだけです。

次に、画像を提供するために HttpHandler を実装すると、好きな場所に画像を保存できます。非常に基本的な実装を次に示します。

public class myPhototHandler: IHttpHandler
{    

    public bool IsReusable {
        get { return true; }
    }

    public void ProcessRequest(System.Web.HttpContext context)
    {

            if (Context.User.Identity.IsAuthenticated) {
                var filename = context.Request.QueryString("f") ?? String.Empty;
                string completePath = context.Server.MapPath(string.Format("~/App_Data/Photos/{0}", filename));
                context.Response.ContentType = "image/jpeg";
                context.Response.WriteFile(completePath);             
            }

    }

}

ハンドラーの設定に関する優れたリソースについては、このブログ投稿とその他の関連投稿を確認してください。

于 2010-05-14T15:29:10.663 に答える
1

基本的に2つのオプションがあります

1) バイナリをデータベースに保存します。VARBINARY(MAX) フィールドは、データ型の適切な選択になります。2) ディスクに保存されているイメージへのパスをデータベースに保存します。NVARCHAR(MAX) はデータ型に適しています。

もちろん、両方のソリューションの長所と短所があります。あなたの要件についてもっと知らなければ、どちらが最善の方法であるかをアドバイスするのは難しい.

于 2010-05-14T15:23:59.783 に答える
0

私はあなたの解決策を過度に複雑にしません。データベースにイメージを保存することの欠点は、バックアップのデータベースの肥大化とストレージ要件です。特に、イメージが12時間しか使用できない場合はそうです。疑わしい場合は、シンプルにしてください。要件が変更されても、とにかくそれほど多くの時間を費やしていません。

これが私のサイトでのやり方です。

  • 画像をフォルダに保存します。
  • ユーザーに表示されるファイル名を制御する場合、または条件付きロジックを使用する場合は、HttpHandlerを使用して画像を提供します。それ以外の場合は、そのフルパスとファイル名をimgタグで使用します。
  • 大量のメガサイトについて話している場合は、コンテンツ配信ネットワークの使用を検討してください。
于 2010-05-14T15:48:46.177 に答える
0

SQL サーバーへのラウンドトリップ時間を軽減するためにイメージをキャッシュすることを検討しましたか? キャッシングは、ブラウザー ( HTTP Headers経由) および/またはイメージを提供する HTTP ハンドラー ( System.Web.Caching経由)で適切な場合があります。

イメージを SQL サーバーに保存すると、ファイル システムへのポインタの維持について心配する必要がないので便利です。ただし、データベースのサイズは明らかにはるかに大きくなり、バックアップとメンテナンスがより複雑になる可能性があります. 画像テーブル用にデータベース内で別のファイル グループを使用するか、または完全に別のデータベースを使用して、行データを画像データとは別に維持できるようにすることを検討してください。

また、SQL サーバーを使用すると、同時実行制御、パーティショニング、およびレプリケーションのオプションが簡単になることも意味します。これらがアプリケーションに適している場合に限ります。

于 2010-05-14T15:55:38.240 に答える