2012-01-05 12 views
1

私はAsp.Net MVC Webサイトを作成しています。ウェブサイト用のSQL Serverにファイル(写真)を保存することの長所と短所

私は過去に重いアプリケーション、複数の層のアプリケーションのために、ファイルを格納するためにデータベースを使用しました。

しかし、今私は自分自身に質問しています。これはウェブサイトにとっては良い考えですか?パフォーマンスビューでは?

それは私にはいくつかの長所を持っています

  • は、接続しているユーザは、(私のプロジェクトのために必要な)画像を表示する権利を持っているなら、私は簡単に制御できます
  • 許可を我々は一貫していることを確認しますデータ(それ以外の場合は既存のファイルを持つことができますが、データベースに情報はなく、その反対のファイルもあります。
  • フェイルオーバーWebサーバーが必要です。これらのファイルは3番目のサーバーからインポートされるため、フェイルオーバーサーバーにASP.Net Webサイトとレプリケートされたデータベースを必要とするだけで、ファイルを同期する必要はありません。

しかし、それはあまりにもいくつかの短所があります。

  • あり100〜200メガバイトのようないくつかの大きなファイルを(それは少数派だが、それが起こるのだろう)、そして私はそれがこれを持って良いことだかわかりませんデータベースのファイルの種類は?(これはもっと質問のようです))
  • 私はそれが良いパフォーマンスを持っているとは確信していますか?

あなたはどう思いますか?これは妥当ですか?私はインターネットで検索しましたが、ウェブサイトに関するいくつかの議論が見つかりませんでした。私の質問は主にFILESTREAM VS FILESYSTEMについてですが、私はFileStreamが遅くても大丈夫だと確信していますか?なぜなら、それがほんの数パーセントであれば、それに見合う価値のある機能が得られるからです。

+0

200Mgは少数ですが、通常は2G +に達します。 – Aristos

答えて

3

ファイルが積極的に変化するシステムの一部であり、他のデータと共にバックアップする必要がある場合 - しかし SQLを使用する場合はFILESTREAMフィールドを使用してくださいサーバ2005+以上でファイルが十分に大きい - たとえば500k +

ファイルが静的コンテンツの場合、DB内にポインタだけを入れてファイルを保存することができます。これにより、すべてのカスタムアクセス許可マシンが考慮されることはありません。

DB内のファイルを格納して作業することは、通常ファイルシステムよりも遅くなりますが、すべてあなたのニーズに依存します。

+0

私の場合、それは実際にビジネスデータであり、多くの変更はありません(+ 10-20ファイル(0.5から200MB、ファイルの大部分は2-3Moです)週)。 filestreamをファイルシステムよりも遅く使用していることを知っていますか? – J4N

+1

filestreamを使用するPROPERはファイルシステムを使用するよりも遅くはないが、ファイルを純varbinary(max)列に格納するとDBの処理速度が少し遅くなる –

+1

これらのビジネスデータが必要な場合、特にバックアップ/復元操作の場合 - これらのファイルをDBに保存する必要があります –

3

なぜtxtファイルの代わりにdbを使用するのですか?その速さはインデックスを使用するためです。 dbにファイル全体を格納することは決して良いことではありません。 dbを通常のimgファイルのインデックス(ポインタ)として使用します。

  • あなたは簡単にcontrollできますが、ウェブの外ASP/PHPと設定されたルートの画像フォルダに画像を表示する場合は、ユーザーが画像を見る権利を持っている場合:限り、あなたの長所/短所が行くように

    あなたはデシベル内のファイルを持っている場合

  • あなたは文句を言わないのCDNを使用することができます(http - デシベルで全体のファイルを保存するルートは

  • 10回(http://blog.sitek.com.au/2008/03/comparison-between-storing-imagesfiles-in-mysql-and-on-filesystem/私は、MySQLのテストのために知っているが、MSSQL用の似た)遅くCCAです://en.wi kipedia.org/wiki/Content_delivery_networkは)

+0

あなたの大きな議論をありがとうございます。しかし、私はMySqlとMS SQLの間に大きな違いがありますが、MS SQLにはFILESTREAMタイプがあります(これは専門家ではありません)がBLOBフィールドよりもはるかに効率的であると考えられています。 (そして、私の場合は、これらのファイルはログオンしたユーザーだけが利用できます(ビジネスプロセスのため、ここでは1つのプロセスしかないので、CDNで利用することはできません) – J4N

+0

こんにちはMiha、 msgstr "通常のimgファイルのインデックス(ポインタ)としてdbを使用してください"#:。msgstr "あなたのイメージを物理的にディスク上のwinディレクトリに保存し、そのパスをDBに保存することを意味しますか? " – Alok

+0

@ Alok - ほとんどの場合、イメージデータ(タイトル、ID、タイプなど)を保存して、あなたが望むイメージを素早く探し出し、物理的なイメージをファイルシステムに保存することができます。 これに関する良い議論があります:http://stackoverflow.com/questions/3748/storage-images-in-db-yea-or- –

6

To Blob or Not To Blobと呼ばれるMicrosoft Researchの本当に良い紙あります。

パフォーマンステストおよび分析多数の後の彼らの結論はこれです:あなたの写真や文書がVARBINARYカラムは、より効率的であるデータベースに格納、一般的にサイズが256K以下である場合

  • 通常、画像やドキュメントのサイズが1 MBを超える場合は、ファイルシステムに格納する方が効率的です(SQL Server 2008のFILESTREAM属性ではトランザクション制御とデータベースの一部です)

  • これら二つの間で
  • 、それはあなたがSQL Serverテーブルにあなたの写真を置くことにした場合、私は強く、それらを保存するための別のテーブルを使用することをお勧めしますご利用に

に依存トスアップのビットです写真 - 従業員表に従業員の写真を保管しないでください - 別の表に保管してください。このようにして、社員テーブルは、従業員の写真を選択する必要がないと仮定して、クエリの一部として、リーンで平均的で非常に効率的な状態を保つことができます。

ファイルグループについては、イントロについてはFiles and Filegroup Architectureをチェックしてください。基本的には、最初から大きなデータ構造用に別のファイルグループを使用してデータベースを作成するか、後で追加のファイルグループを追加することになります。それを "LARGE_DATA"としましょう。今

、あなたはVARCHAR(MAX)またはVARBINARY(MAX)列を格納する必要が作成するための新しいテーブルを持っている時はいつでも、あなたが大規模なデータのために、このファイルグループを指定することができます。

CREATE TABLE dbo.YourTable 
    (....... define the fields here ......) 
    ON Data     -- the basic "Data" filegroup for the regular data 
    TEXTIMAGE_ON LARGE_DATA -- the filegroup for large chunks of data 

チェックアウトMSDNのファイルグループに関するイントロとその周辺で遊ぶ!

+0

私の場合、メタデータ(名前、サイズ)のみで "File"テーブルに格納されるので、このフィールドをth同じテーブル。あなたは私に良いコメントをたくさん与えていますが、あなたのリンクがBLOBとファイルシステムを比較しているので、ファイルストリームとファイルシステムのどちらを選択するのにも大したことはありません。 – J4N

+0

@marc_s:非常に良い研究論文の+1 –

関連する問題