それは、必要な障害点の数と応答時間の速度に大きく依存します。
ファイルシステムに保存する場合:
- 着信 HTTP 要求
- PHP がデータベースにクエリを実行する
- データベースは行を見つけます
- PHP がクエリ応答を解読する
- PHPはファイルを読み取ります
- PHP は、ファイルのバイナリ コンテンツを HTTP 要求への応答として送信します。
ただし、データベースにバイナリ BLOB として保存する場合は、次のようになります。
- 着信 HTTP 要求
- PHP がデータベースにクエリを実行する
- データベースは行を見つけます
- PHP がクエリ応答を解読する
- PHP は HTTP 要求への応答としてバイナリ コンテンツを送信します。
どちらの場合も、ステップ 3 (データベースが行を見つける) は、適切なインデックス/キーが設定されている限り、blob 列を使用しない場合と同じくらい高速です。MySQL は、ポインターを正確なインデックス位置に内部的に移動します。正しいバイトが見つかるまで、実際にはすべてのバイトを通過するわけではありません (それがインデックスのポイント全体です)。これは、PHP がファイルを手動で読み取るのと同じくらい時間がかかります。ただし、現在、これをサポートするサポート パフォーマンス データはありません。
次に、失敗のポイントについて説明します。
- データを移行するとします。バイナリ イメージ データがデータベースに格納されている場合は、データベースを移動するだけです。ただし、バイナリ イメージ データがファイル システムに保存されている場合は、両方を移動することを忘れないでください。また、移行のサイズは同じ (または少なくとも最小限の違い) になることに注意してください。
- アセットの名前を変更することを検討してください。データベースだけでなく、ファイル システムでも名前を変更する必要があります。DBで名前を変更するのは1つだけであるのとは対照的に、これは合計2つのステップです。
- アセットを削除することを検討してください。両方の場所で削除する必要があります。
移植性、柔軟性、および障害や破損を最小限に抑えるために、私は常にバイナリ データを BLOB としてデータベースに格納してきました。
ファイルを BLOB としてデータベースに保存する場合は、さまざまな BLOB ストレージ要件を考慮してください: http://dev.mysql.com/doc/refman/5.0/en/storage-requirements.html#id656744
- TINYBLOB - 256 バイト
- MEDIUMBLOB - 64 キロバイト
- LONGBLOB - 4 ギガバイト
最後に、ちょっと考えさせてください。私は、新進気鋭のエンタープライズ レベルのコンテンツ管理システムである Adobe の Day CQ を使用した経験があります。主に Java で書かれていますが、注意すべき重要な点はデータ アーキテクチャです。それは多かれ少なかれ多次元 MySQL データベースのように機能する JCR (Java コンテンツ リポジトリ) を使用します (ちょっとかっこいい?)。その DAM (デジタル アセット マネージャー) 内のすべての画像データは、JCR 内のノードとして格納されます。