私は、ファイルをファイル システムに格納するソフトウェアと、それらのファイルへの参照をデータベースに格納するソフトウェアの開発に取り組んでいます。したがって、アップロードされたファイルのクエリは、ファイル システムにアクセスすることなく、データベースで実行できます。私が他の投稿で読んだことによると、ほとんどの人は、バイナリ データを 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 に傾倒しています。これは単純であり、ユーザーがファイルをアップロードする前に要求しようとすることを心配する必要がないからです。ストレージは安価なので、参照されていないファイルがスペースを占有することになっても、世界の終わりではありません。しかし、これもよくある問題のように思えます。他の人がどのように解決したか、または私がすべきその他の考慮事項を聞きたいです。