私は、ユーザーがプロフィールに写真を添付できるasp.net MVCアプリケーションを構築していますが、最近のメッセージなどを表示するダッシュボードのメッセージングガジェットのようなシステムの他の領域でも.
ユーザーがこれらをアップロードするとき、データベースとディスクのどちらに保存するのがよいか迷っています。
データベースの利点
データベース全体を簡単にバックアップし、関連付けられたプロファイル/ユーザー テーブルでプロファイル コンテンツ/画像を保持します。
後でWebサービスを構築すると、プロファイルに関連するすべてのデータを1つの場所(データベース)から取得できます
ファイルシステムの利点
ディスクからファイルをロードする方がおそらく高速です
他の利点は?
他のサイトはこの種の情報をどこに保存していますか? このような場合、データベースのパフォーマンスについて少し心配するのは正しいですか?
データベースから引き出された画像を一定期間キャッシュする方法があるのではないでしょうか?
あるいは、これらのイメージをデータベースに保存し、Web サーバーがそこからロードできるようにディスクにシャドウ コピーするというアイデアはどうでしょうか。これは、ディスク上のファイルの速度の利点を提供しながら、Db のバックアップと利便性の両方を提供するように思われます。
問題のインフラストラクチャ
- Web サイトは、NTFS ファイル システムを実行している Windows Server 2003 上の IIS に展開されます。
- データベースは SQL Server 2008 になります
概要
SO に関する多くの関連スレッドを読んでいると、多くの人が現在、SQL Server Filestream タイプに傾倒しています。ただし、私が収集できたものから (私が間違っている可能性があります)、ファイルが非常に小さい場合はあまりメリットがありません。ただし、ファイル ストリーミングは、ファイルが数 MB 以上の場合にパフォーマンスを大幅に向上させるように見えます。
私のプロフィール写真は約 5kb 程度に収まる傾向があるため、データベースのファイルストアに varbinary(max) として保存することにしました。
ASP.NET MVC では、このようにデータベースから引き出された画像に対して FileContentResults を返すパフォーマンスの問題が少し見られました。したがって、このファイルの場所がアプリケーションキャッシュに見つからない場合、読み取り時にファイルをディスクにキャッシュすることになりました。
だから私はハイブリッドに行ったと思います。
- データのベイクアップを容易にするデータベース ストレージと、ファイルをプロファイルに直接リンクする
- キャッシュを改善するためのディスクへのシャドウ コピー
いつでもディスク上のキャッシュ フォルダーを削除できます。画像が再要求されると、最初のヒットで再コピーされ、その後キャッシュから提供されます。