14

ファイル管理と大規模プロジェクト内での保存について、SO に関する非常に良い質問がいくつかあります。

DB への画像の保存 - 賛成か反対か?
バイナリ データをデータベースとファイル システムのどちらに保存しますか?

最初のものはいくつかの素晴らしい洞察を持っており、私のプロジェクトでは、DB ルートではなくファイル ルートを使用することにしました。

ファイルシステムの使用に対する主なポイントはバックアップです。しかし、私たちのシステムには優れたバックアップ スキームがあるので、その心配はありません。

次のパスは、実際のファイルを格納する方法です。また、ファイルの場所を常に静的にして、データベース側に仮想ディレクトリ システムを作成することも考えました。したがって、ファイルへのリンクは変更されません。

私が構築しているシステムには 1 つのグローバル ファイル管理があり、すべてのユーザーがすべてのファイルにアクセスできます。しかし、ファイルルートに行った多くの人は、物理ディレクトリのサイズについて話します (たとえば、すべてのファイルが 1 つのディレクトリ内にある場合)。

したがって、私の質問は、これらの静的ファイルのフォルダーを作成する際のヒントやベスト プラクティスの方法は何か、または仮想ディレクトリ ルートをまったく使用すべきではないかということです。

(プロジェクトはLAMPスタック(PHP)上にありますが、それがまったく役立つ場合)

4

6 に答える 6

12

1 つの方法は、各ファイルに一意の番号を割り当て、それを使用して実際のファイルの場所を検索することです。次に、その数を使用して、ファイルシステム内の異なるディレクトリにファイルを配布します。たとえば、次のスキームのようなものを使用できます。

/images/{0}/{1}/{2}

{0}: file_number % 100
{1}: (file_number / 100) % 100
{2}: file_number

于 2009-03-22T16:49:11.207 に答える
9

かなり前に、大量のファイルをホストしている Web サイトでこの問題に遭遇しました。私たちが行ったことは、GUID (ファイルのプライマリ キー フィールドでもある) (例: BCC46E3F-2F7A-42b1-92CE-DBD6EC6D6301) を取得し、次のようなファイルを保存することでした: /B/C/C/BCC46E3F-2F7A-42b1 -92CE-DBD6EC6D6301/filename.ext

これには次の利点があります。

  • ファイル サーバーを複数のサーバーにスケールアウトできます (そして、それぞれに特定のディレクトリを割り当てます)。
  • ファイルの名前を変更する必要はありません
  • ディレクトリは一意であることが保証されています

お役に立てれば!

于 2009-03-22T17:47:48.520 に答える
8

1 つのディレクトリに過剰な数のエントリが作成されるのを避けるために、ファイル名の一部に基づいてディレクトリを作成することをお勧めします。たとえば、d7f5ae9​​b7c5a.png という名前のファイルがある場合、media/d7/f5/d7f5ae9​​b7c5a.png に保存することができます。ファイル名がすべて 16 進数の場合、1 つのディレクトリ内のエントリ数が最終レベルまで 256 に制限されます。

于 2009-03-22T16:50:42.043 に答える
2
  1. 1 ユーザー イメージ ~ 100 kb、データベースに 10,000 ユーザーがいるとします。各ユーザーは平均で 5 つのイメージを持つため、5 テラバイトの DB があり、各イメージ出力は DB を介して実行され、この余分な DB トラフィックが削減されます。一般的な DB サーバーのパフォーマンス。...これを回避するためにDBクラスターを使用することもできますが、高価であると仮定します

  2. ライブ データベースでのエラーに関するユーザー レポート (テスト時 - すべて正常に動作します)。どのようにダンプを作成し、開発者のマシンで解凍しますか? どのくらいの時間がかかりますか?

  3. ある瞬間に CDN に画像を配置することを決定できます。ソース コードにどのような変更が加えられるでしょうか?

于 2009-03-22T17:02:16.243 に答える
1

私は通常、次のアプローチを取ります。

アップロードしたファイルを保存するフォルダーを指すアプリケーションのグローバル設定変数を用意します。データベースにファイルへの相対パスを保存します (設定変数が指すものに関連します)。

したがって、ファイルが /www/uploads/image.jpg にある場合、設定変数はデータベース行に image.jpg がある /www/uploads を指します。これは、システムのディレクトリ構造をアプリケーションから分離する柔軟な方法です。

さらに、関連するデータベース テーブルに基づいて、ディレクトリ内のファイル ストレージを断片化できます。テーブル user_reports とテーブル user_photos があるとします。/www/uploads/user_reports に user_reports に関連するファイルを保存します。多数のユーザー アップロードがある場合は、フラグメント化をさらに実装できます。ユーザーが 2009 年 3 月 20 日にファイルをアップロードするとします。このファイルは report.pdf という名前なので、/www/uploads/user_reports/2009/03/20/report.pdf に保存します。

于 2009-03-22T16:51:29.047 に答える