2011-10-09 8 views
8

mysqlを使って作業しているときは、イメージをBLOBとしてデータベースに格納することは悪い考えです。なぜなら、データベースがかなり大きくなり、データベースの通常の使用に有害です。それから、イメージファイルをディスクに保存し、データベース内のリンクを保存する方が良いでしょう。イメージファイルをMongoデータベースに保存するのは良い考えですか?

しかし、データベースファイルサイズを大きくするとパフォーマンスにはほとんど影響がないため、これはMongoDBとは異なると思います(これが、MongoDBが数十億件のレコードを正常に処理できる理由です)。

MongoDB(GridFS)に画像ファイルを保存して、サーバに保存されているファイルの数を減らすほうがよいと思いますか?それでもデータベースを可能な限り小さく保つ方が良いでしょうか?

答えて

10

問題はそれほど多くなく、データベースはそれを扱うことができます(ただし、MongoDBはそれほど多くの点で優れていません)。問題は、クライアントにデータを送信するには、最初にデータベースによってRAMに移動し、アプリケーションのメモリにコピーしてから、ソケットを通して送信するためにカーネルに渡す必要があることです。それは、RAMとCPUサイクルの多くを無駄にしています。ファイルシステムに大きなファイルを入れる方が良い理由は、ファイルシステムをコピーするのが簡単だからです。ディスクからファイルを直接ソケットにストリームするようにカーネルに依頼することができます。

大きなファイルをファイルシステムに格納することの欠点は、配布するのがずっと難しいことです。 MongoのGridFSのようなデータベースを使ってスケールアウトすることができます。一度にアプリケーションのメモリにファイル全体をコピーするのではなく、一度にチャンクをコピーしないようにしてください。ほとんどのWebアプリケーションフレームワークでは、最近チャンクされたHTTP応答を送信するためのサポートがいくつかあります。

2

MongoDBのGridFSは、この種のストレージ用に設計されており、すべてのサーバーで使用できるように、さまざまなサーバーにイメージファイルを格納するのに非常に便利です。

5

答えははいです。古くからの洞窟では、サーバは変更可能なファイルシステムを変更することができました。私たちが物事を拡大しようとするまでこれは素晴らしいことでした。

今日、洞窟の人々はimmutable deploymentsでアプリを構築しています。 HerokuおよびDokkuはこれの例です。 Webアプリケーションサーバーには状態がないため、簡単に作成、アップグレード、スケーリング、破棄することができます。

まだファイルがあるので、どこかに置く必要があります。いくつかのソリューションがあります:nfs、私たちのデータベース、誰かのデータベースです。

  • nfsは、ネットワークリソース上でファイルを入出力する「ネットワークファイルシステム」です。とにかくネットワークを扱っているのであれば、IMHOはそれがあなたがすでに知っているものでなければ、それほど価値を追加しません。

  • 私たちのデータベース - MongoDB there are two optionsの場合:(ファイル> 16MB)? GridFS:BinData

  • Someone elsesデータベース - 一部はAmazon S3のように基本的なものもあれば、CloudnyやDropboxなどの追加サービスを提供するものもあります。

あなたは大型予算の企業チームにしていると誰かが40時間確認後、サーバーの世話をして一週間を費やしている場合 - ファイルシステムを使用します。規模の拡大したWebアプリケーションを構築する場合は、ファイルをDBに格納することが理にかなっています。

パフォーマンスを懸念している場合:

1)クライアントのためにあなたのコンテンツをホストするためのプロキシ(例えば、nginxの)またはCDNを使用します。サーバーがキャッシュミスを処理するだけでよい。

2)ストリーミングIO Nodeschool has a cool tutorial for Node.jsを使用してください。

0

ので、画像を格納することは、任意のDBには良いアイデアではない:DBへの読み取り/書き込みは、常にあなたのDBのバックアップが巨大で、より多くの時間に成長ファイルシステム

  • より遅い

    • ファイルへ
    • アクセスを消費することになりました
    • 最後の2

    が本当のキラーあるあなたのアプリとDB層を通過する必要があり。

    出所:Three things you should never put in your database

    あなたのアプリケーションを巧妙にすることができれば、に写真をアップロードしない方がよいでしょう。MongoDB

    しかし、あなたが締め切りに近づいていると、データベースが非常に大きくなりすぎず、アプリケーションの実行中のマシン上の使用可能なRAMを超えることはありません。引用論文の著者とは対照的に)、画像をMongoDBに保存することを検討することができます。これは簡単で便利で迅速に実装でき、柔軟性があります。

  • 関連する問題