2009-11-11 6 views
10

今後のプロジェクトでMySQL blobフィールドタイプを使用する必要があるかどうかを判断するのは苦労しています。MySQLのblobフィールドタイプを使用する必要がありますか?

私の基本的な要件は、閲覧可能で、複数のファイルをアップロードしてそれらのレコードに「添付」することができる特定のデータベースレコードがあることです。その記録を見ることは、ケースバイケースで特定の人々に限定することができます。ファイルの種類は事実上制限なくアップロードできます。

私はMySQLのルートに行くと、それを見て、私はウイルスの這い上がったりランダムなPHPファイルがアップロードされ、何らかの形で実行される心配する必要はありません。私はまた、レコードの近くにデータを結び付けたままにしておき、アクセスを許可しておく方がはるかに簡単です。

もう1つの明らかなルートは、Webルートの外部の特定のフォルダ構造にデータを格納することです。この場合、データベース内で参照されているものを追跡するために、フォルダ/ファイル用の特別な命名規則を考えなければなりません。

MySQL blobフィールドタイプを使用するとパフォーマンスが低下しますか?私は、ウェブサイトの将来の成長を妨げるだけでなく、維持しにくい解決策を選択するソリューションを選択することに懸念しています。

答えて

10

WebサーバーがこれらのアップロードされたファイルをWeb上で配信する場合、パフォーマンスがファイルシステムに格納されていると、パフォーマンスはほぼ確実に向上します。 Webサーバーは、Last-ModifiedETagなどのHTTPキャッシュヒントを適用して、同じファイルに複数回アクセスするユーザーのパフォーマンスを向上させることができます。さらに、Webサーバーは、提供するときに自動的にファイルの正しいContent-Typeを設定します。 blobをデータベースに保存すると、Webサーバーから無料で入手する必要がある場合に、上記の機能などを実装することになります。

さらに、大きなblobデータをデータベースから取り出すと、データベースにパフォーマンスのボトルネックが発生する可能性があります。また、データベースのバックアップは、より多くのデータをバックアップするため、時間がかかります。開発中にアドホッククエリを実行している場合は、selectステートメントの結果セットに大きなブロブがあるのが不便です。アップロードされたファイルを単純に検査したいのであれば、データベースの列に不自然に保存されるため、不便で迂回することになります。

私は、ファイルシステム上のファイルとデータベース内のファイルへのパスを保存するという一般的な方法に固執します。

2

大量のデータが最終的にパフォーマンスに悪影響を及ぼします。

http://msdn.microsoft.com/en-us/library/cc949109.aspx

は、私はあまりにもあなたのプロジェクトのためにあまりにも同様のアプローチを採用します:MS SQL 2008には、特殊なファイルシステム内のバイナリデータを格納する方法があります。

たとえば、元の名前などのファイルに関する情報を保持するFILESテーブルを作成できます。ディスクにファイルを安全に保存するには、たとえばGUIDを使用してファイルの名前を変更します。新しいファイル名をFILESテーブルに保存します。ユーザーがファイルをダウンロードする必要があるときは、ディスク上に簡単に配置してユーザーにストリームすることができます。

0

私の意見では、データベースにファイルを格納するのは悪い考えです。あなたがそこに格納できるのは、ID、名前、タイプ、おそらくファイルのmd5ハッシュ、および挿入された日付です。ファイルは、公共の場所以外のフォルダにアップロードすることができます。また、1つのフォルダに1000を超えるファイルを保存することをお勧めしないという懸念があります。ですから、ファイルIDが1000ずつ増えるたびに新しいフォルダを作成する必要があります。

9

MySQL blobフィールドタイプを使用するとパフォーマンスが低下しますか?

本質的にではありませんが、大きなBLOBがテーブルやメモリキャッシュを詰まらせていると、パフォーマンスが低下する可能性があります。

もう1つの明らかなルートは、Webルートの外部の特定のフォルダ構造にデータを格納することです。この場合、データベース内で参照されているものを追跡するために、フォルダ/ファイル用の特別な命名規則を考えなければなりません。

はい、これは一般的なアプローチです。プライマリキーのみに基づくファイル名(理想的には整数、確かにユーザーが提出したものは絶対にありません)を含む、関連する各テーブルの名前を付けたフォルダーを持つようなことが通常あります。

これは良い考えですか?場合によります。単一のデータストアしか持たず、Webユーザーに何かへの書き込みアクセスを与えることを心配する必要がないという点で、展開の単純さの利点があります。また、アプリケーションの複数のコピーが実行されている場合(アクティブ - アクティブロードバランシングなど)、ストレージを同期する必要があります。これは、ファイルシステムよりもデータベースでの方がはるかに簡単です。

blobではなくファイルシステムを使用している場合は、フォルダにエイリアスを指定してWebサーバーにサービスを提供するのですか?

  • +超高速
  • +キャッシュがうまく
  • です - 余分なサーバ設定:仮想ディレクトリ。 Content-Disposition: attachment/X-Content-Type-Optionsヘッダを追加する必要がアンチXSSの一部としてHTMLのための盗聴IEを停止する

を測定したり、あなたがして手動でファイルを提供します:余分なサーバ設定が - Content-Type

  • 希望返すために、適切なファイル拡張子を必要としますあなたがMySQLのblobから提供しなければならないように、サーバサイドのスクリプトを吐いてしまいましたか?

    • は -
    • 潜在的に遅いです - ので、変更される場合は、マニュアルの公平なビットを必要としたETagが正しく
    • +をキャッシュするために取り扱いが正しい追加しやすいアプリケーションの独自のアクセス制御方法
    • +を使用することができます配信スクリプトのコンテンツタイプヘッダーとコンテンツ処理ヘッダー

    これはトレードオフであり、グローバルに受け入れられている回答はありません。

  • 2

    データベース内のブロブ内に添付ファイル(通常は画像に適用されます)を保存することをお勧めします。代わりに、データベースに文字列としてパス名を格納し、ファイルシステム上のどこかにファイルを安全に格納することを好みます。これにはいくつかメリットがあります。

    • データベースとデータベースのバックアップがより小さくなりました。
    • アドホックで作業する必要がある場合は、ファイルシステム上のファイルを編集する方が簡単です。
    • ファイルシステムはファイルを格納するのに適しています。データベースはタプルを格納するのに適しています。それぞれがそれをうまくやってみましょう。自動的に関連付けられた添付ファイルを削除し、データベース内の行を削除する

      はブロブに入れて添付ファイルをサポートあまりにも反論があります。

    • データが行内にあるときにはロールバックとトランザクション分離が正常に機能しますが、データの一部がファイルシステム上にあるときは機能しません。
    • すべてのデータがデータベースにある場合は、バックアップが簡単になります。バックアップ手順中に同時に変化するデータの一貫したバックアップを作成することについて心配する必要はありません。

    したがって、アプリケーションでデータをどのように使用するかによって最適な解決策が決まります。誰にも合った答えはありません。

    この質問を読んでいる人がRDBMSの他のブランドを使用している場合、Oracleを使用する場合はBFILE、Microsoft SQL Server 2008を使用する場合はFILESTREAMを調べるとよいでしょう。データベースの外部にファイルを格納するが、データベーステーブルの行の一部であるようにファイルにアクセスする(多かれ少なかれ)。

    2

    データは、1つの一貫した場所、つまりデータベースに格納する必要があります。 このパフォーマンスとContent-Typeの問題はまったく問題にはなりません。なぜなら、BLOBフィールドをローカルWebサーバーにキャッシュして初めて要求されたときにそこから提供することを止めるものがないからです。すべてのページビューでそのテーブルにアクセスする必要はありません。

    このファイルシステムキャッシュはいつでも空にすることができます。自動的に補充されるため、一時的にパフォーマンスに影響を与えます。また、アプリケーションの規模が大きくなるにつれて、1つのデータベースと多くのWebサーバーを使用できるようになります。それらはすべてファイルシステム上にローカルキャッシュを持っています。

    5

    私の経験では、BLOBをMySQLに格納するのはOKです。他のフィールドが別の(結合された)テーブルにある間は、BLOBのみを1つのテーブルに格納する限りです。逆に、いくつかの標準フィールドと100 MBのデータを持つ1つのBLOBフィールドを持つテーブルのフィールドを検索すると、クエリが劇的に遅くなる可能性があります。

    メールの送信日、メールアドレスなどと同じテーブルにコンテンツが保存されているこの問題では、メールアプリケーションのデータレイヤーを変更する必要がありました.10000個のメールを検索するのに9秒かかっていました。今それは取るべきものを取ります;-)

    関連する問題