25

私は、ファイルをファイル システムに格納するソフトウェアと、それらのファイルへの参照をデータベースに格納するソフトウェアの開発に取り組んでいます。したがって、アップロードされたファイルのクエリは、ファイル システムにアクセスすることなく、データベースで実行できます。私が他の投稿で読んだことによると、ほとんどの人は、バイナリ データを BLOB としてデータベースに直接格納するよりも、ファイル ストレージにファイル システムを使用する方が良いと言っています。

だから今、データベースとファイルシステムの両方が同期を保ち、存在しないファイルへの参照やファイルがスペースを占有しないように、これを設定する最良の方法を理解しようとしています参照されていないファイル システム。ここに私が検討しているいくつかのオプションがあります。

オプション 1: 最初にファイル参照を追加する

//Adds a reference to a file in the database
database.AddFileRef("newfile.txt"); 

//Stores the file in the file system
fileStorage.SaveFile("newfile.txt",dataStream); 

ファイルへの参照が実際のファイルの前に追加されるため、このオプションには問題があり、システムに実際に格納される前に別のユーザーがファイルをダウンロードしようとする可能性があります。ただし、ファイルへの参照は事前に作成されるため、ファイルを保存するときに主キーの値を使用できます。

オプション 2: ファイルを最初に保存する

//Stores the file
fileStorage.SaveFile("newfile.txt",dataStream); 

//Adds a reference to the file in the database
//fails if reference file does not existing in file system
database.AddFileRef("newfile.txt"); 

このオプションの方が優れていますが、参照されていないシステムに誰かがファイルをアップロードする可能性があります。これは、参照されていないファイルを削除する「Purge」または「CleanUpFileSystem」関数で修正できますが。このオプションでは、データベースの主キー値を使用してファイルを保存することもできません。

オプション 3: 保留中のステータス

//Adds a pending file reference to database
//pending files would be ignored by others
database.AddFileRef("newfile.txt"); 

//Stores the file, fails if there is no 
//matching pending file reference in the database
fileStorage.SaveFile("newfile.txt",dataStream); database

//marks the file reference as committed after file is uploaded
database.CommitFileRef("newfile.txt"); 

このオプションを使用すると、ファイルをアップロードする前に主キーを作成できますが、アップロードする前に他のユーザーがファイルへの参照を取得することもできなくなります。ただし、ファイルがアップロードされず、ファイル参照が保留中のままになる可能性があります。それでも、保留中の参照をデータベースからパージすることもかなり簡単です。

私はオプション 2 に傾倒しています。これは単純であり、ユーザーがファイルをアップロードする前に要求しようとすることを心配する必要がないからです。ストレージは安価なので、参照されていないファイルがスペースを占有することになっても、世界の終わりではありません。しかし、これもよくある問題のように思えます。他の人がどのように解決したか、または私がすべきその他の考慮事項を聞きたいです。

4

3 に答える 3

3

別の選択肢を提案したい。ファイル名を常にその内容のハッシュと等しくします。そうすれば、他の場所への参照を追加する前にそれを行うという条件で、いつでも安全にコンテンツを書き込むことができます。

コンテンツは変更されないため、同期の問題はありません。

これにより、重複排除が無料で提供されます。ただし、削除は難しくなります。毎晩のガベージ コレクション プロセスをお勧めします。

于 2013-03-15T19:00:08.153 に答える
0

データベースの実際の用途は何ですか? それが単なるファイルのリストである場合は、まったく必要ないと思います。また、それを持たないことで、同期の手間が省けます。

必要であると確信している場合、オプション 1 と 2 は技術的な観点からはまったく同じです。2 つのリソースは同期していない可能性があり、それらを再度統合するための定期的なプロセスが必要です。したがって、ここでは、アプリケーションに最適なオプションを選択する必要があります。

オプション 3 にはまったく利点がありませんが、より多くのリソースを使用します。

usr によって提案されているように、ハッシュを使用すると、理論的に衝突の危険性があることに注意してください。また、オプション 1 と 2 の場合と同様に、定期的な統合プロセスも必要です。

もう 1 つの問題は、部分的なアップロードと進行中のアップロードをどのように処理するかです。ここではオプション 2 を使用できますが、アップロードの開始前に作成され、アップロードの完了時に削除される 2 番目の「フラグ」ファイルを使用することもできます。これは、どのアップロードが中止されたかを判断するのに役立ちます。

于 2013-03-15T19:15:01.063 に答える