通常、大きなファイルをリレーショナルデータベースに保存することは望ましくありません。これは、それらが設計されたものではありません。また、いくつかの例外はありますが、NoSQLソリューションは通常、このために設計されていないため、使用しないことをお勧めします(以下を参照)。
ファイルシステムにファイルを保存するという最後のアイデア(これがファイルシステムの設計目的であることに注意してください;)は、おそらく正しいアプローチです。これは、スケーラビリティ要件によっては多少難しい場合がありますが、次のいずれかを使用することをお勧めします。
さん。SANは、ネットワーク内に冗長で可用性の高いストレージソリューションを提供します。SANが提供するストレージに複数のサーバーを接続し、相互にファイルを共有することができます。このソリューションは通常、エンタープライズ指向であり、確実に実装するにはかなりの費用がかかることに注意してください(少なくとも、物理ハードウェアとRAIDコントローラーおよび多数のディスクが必要です)。
CDN。コンテンツ配信ネットワークは、インターネットを介してエンドユーザーにファイルを提供するためのリモートのグローバル分散システムです。通常、ファイルをサーバー上の場所に配置し、実際に配布するためにCDNに複製します。CDNが機能する方法は、ユーザーが要求しているファイルがない場合、サーバーから自動的にフェッチしようとすることです。ファイルのコピーを1回取得すると、一定期間ファイルをキャッシュします。通常、帯域幅のコストや処理のオーバーヘッドによって膨大な数のファイルを同時に提供することによる制約がある場合は、非常に役立ちます。
クラウドオファリング(Amazon S3、Rackspace CloudFiles)。これらはCDNに似ていますが、既存のクラウドインフラストラクチャを使用している場合は、それでうまく機能します。クラウドAPIにリクエストを発行してファイルを保存すると、CDNの場合と同様に、その後インターネット経由で利用できるようになります。主な違いは、ストレージ要求(作成、削除、または更新)を手動で発行する必要があることです。
提供するファイルの数が少ない場合は、社内ソリューションを使用することもできます。2つまたは3つのサーバーにファイルを保存します(おそらく、サーバーのセットが大きく、スペースが問題になる場合は、ハッシュ計算を使用してシャーディングします)。フロントエンドサーバーがストレージサーバーからファイルを要求するための小さなAPIを構築し、代替サーバーが利用できない場合は代替サーバーにフォールバックします。
私がほとんど忘れていた解決策の1つは(研究目的以外に使用したことはありませんが)、RiakのLuwakプロジェクトです。LuwakはRiakの拡張機能であり、効率的な分散キー/値ストアであり、大きなファイルを一貫したサイズのセグメントに分割し、それらのセグメントをツリー構造に格納してすばやくアクセスできるようにすることで、大きなファイルのサポートを提供します。前の段落で説明した冗長性、シャーディング、およびAPIが無料で提供されるため、調査する必要があるかもしれません。