web-dev-qa-db-ja.com

データベースにメディアファイルを保存する最良の方法は何ですか?

大量のサウンドファイルをデータベースに保存したいのですが、それが良い方法かどうかわかりません。この方法でそれを行うことの長所と短所を知りたいです。

また、これらのファイルへの「リンク」を持つ可能性も考えましたが、おそらくこれは解決策よりも多くの問題を抱えているでしょう。この方向での経験は大歓迎です:)

注:データベースはMySQLになります。

54
David Ameller

私が知っているすべてのシステムは、大量の大きなファイルを保存し、それらをデータベースの外部に保存します。ファイルのクエリ可能なデータ(タイトル、アーティスト、長さなど)のすべてを、ファイルへの部分パスとともにデータベースに保存します。ファイルを取得するときは、ファイルのパスを抽出し、ファイルルート(またはURL)を先頭に追加して返します。

そのため、「a/b/c/1000」などの部分的なパスを含む「location」列があり、それを次にマッピングします。「 http:// myserver/files/a /b/c/1000.mp "

データ回復に必要な場合に備えて、メディアデータベースを別のサーバー/ディレクトリに向ける簡単な方法があることを確認してください。また、データベースをファイルアーカイブの内容と再同期するルーチンが必要になる場合があります。

また、数千のメディアファイルがある場合、それらをすべて1つの巨大なディレクトリに保存しないでください。これは、一部のファイルシステムのパフォーマンスのボトルネックです。代わりに、それらを複数のバランスの取れたサブツリーに分割します。

87
Mark Bessey

適切な実装を使用している限り、データベースに保存することは問題ないと思います。データベース内の大量のデータがパフォーマンスに影響を与えないようにする方法については、この古くて良い記事を読んでください。

http://www.dreamwerx.net/phpforum/?id=1

文字通り何百ものギグがmysqlデータベースに問題なくロードされました。設計と実装が重要です。間違ってやると、苦労します。

DBのその他の利点(まだ説明していません):-負荷分散された環境でより良く機能します-より多くのバックエンドストレージスケーラビリティを組み込むことができます

16
DreamWerx

データベースを使用する利点:

  • サウンドファイルを他のデータビットと簡単に結合できます。
  • データベースのセキュリティをバイパスするファイルI/O操作の回避。
  • データベースレコードの削除時にサウンドファイルを削除するための分離操作は不要です。

データベースを使用することの欠点:

  • データベースの肥大化
  • データベースはファイルシステムよりも高価になる可能性があります
9
Kluge

私はさまざまなプロジェクトで両方の方法で実験してきましたが、最終的にはファイルシステムを使用する方が簡単だと判断しました。結局のところ、ファイルシステムは既にファイルの保存、取得、およびインデックス作成のために最適化されています。

私がそれについて持つ1つのヒントは、データベースへのファイルへの「ルート相対」パスのみを保存し、プログラムまたはクエリ/ストアドプロシージャ/ミドルウェアにインストール固有のルートパラメータを使用してファイルを取得させることです。

たとえば、XYZ.WavをC:\ MyProgram\Data\Sounds\X \に保存すると、フルパスは次のようになります。

C:\MyProgram\Data\Sounds\X\XYZ.Wav

ただし、データベースにパスまたはファイル名を次のように保存します。

X\XYZ.Wav

他の場所では、データベースまたはプログラムの構成ファイルに、SoundFilePathのようなルートパスを保存します。

C:\ MyProgram\Data\Sounds \

もちろん、データベースパスからルートを分割する場所はユーザー次第です。そうすれば、プログラムのインストールを移動する場合、データベースを更新する必要はありません。

また、lotsのファイルがある場合は、パスをハッシュする方法を見つけて、数百または数千のファイルを含む1つのディレクトリで終わらないようにします(私の小さな例では、ファイル名の最初の文字に基づいたサブディレクトリですが、さらに深くしたり、ランダムハッシュを使用することもできます)。これにより、検索インデクサーも幸せになります。

9
CMPalmer

BLOBを使用してファイルを保存するいくつかの利点

  • 管理オーバーヘッドの削減-単一のツールを使用してバックアップ/復元などを行う
  • データベースとファイルシステムが同期していない可能性はありません
  • トランザクション機能(必要な場合)

いくつかの欠点

  • データベースサーバーのRAMを、行、インデックスなどの格納に使用する可能性のある無駄なゴミで爆破します
  • DBバックアップを非常に大きくするため、管理しにくい
  • クライアントにサービスを提供するファイルシステムほど便利ではありません(例:Webサーバー)

パフォーマンスはどうですか?あなたのマイレージは異なる場合があります。ファイルシステムは非常に多様であるため、データベースのパフォーマンスも異なります。場合によっては、ファイルシステムが勝ちます(おそらく、より大きなファイルが少ない場合)。場合によっては、DBの方が優れている場合があります(非常に多数の小さなファイルが含まれている場合があります)。

いずれにせよ、心配しないで、その時点で最善と思われることをしてください。

一部のデータベースには、BLOBを提供する組み込みのWebサーバーが用意されています。執筆時点では、MySQLはサポートしていません。

4
MarkR

それらをBLOB(またはLONG​​BLOB)として保存し、メディアファイルに実際にアクセスしたいときにデータを取り出すことができます。

または

メディアファイルをドライブに保存し、メタデータをDBに保存するだけです。

私は後者の方法に傾いています。世界中でこれがどのように行われているのかはわかりませんが、他の多くの人も同じことをしていると思います。

リンク(データへの部分パス)を保存してから、この情報を取得できます。ドライブ上で物事を簡単に移動し、引き続きアクセスできるようにします。

DB内の各ファイルの相対パスと、ファイルに関する他のメタデータを保存します。実際のデータを別のドライブに移動する必要がある場合、ローカルパスまたはUNCパスを介して、ベースパスをオンザフライで変更できます。

それが私がそれをする方法です。他の人にもアイデアがあると思います。

4
itsmatt

それらを外部ファイルとして保存します。次に、パスをvarcharフィールドに保存します。リレーショナルデータベースに大きなバイナリBLOBを配置することは、一般的に非常に非効率的です。キャッシュがいっぱいになるとスペースを消費し、処理が遅くなるだけです。そして、得られるものは何もありません-塊自体を検索することはできません。ただし、メディアメタデータをデータベースに保存することもできます。

3
winwaed

単純な解決策は、ファイルの相対的な場所を文字列として保存し、ファイルシステムに処理させることです。私はプロジェクトで試してみました(私たちは調査にオフィスの添付ファイルを保存していました)、それはうまくいきました。

1
Josh Kodroff

オーディオ/ビデオファイルを保存する最良の方法は、ローカルまたはクラウド上にある任意の分散ストレージを使用できます。

https://min.io/

クラウドの場合:AWS S3

0
suren