我正在开发一款软件,它将文件存储在文件系统中,并在数据库中引用这些文件。因此,可以在不访问文件系统的情况下,在数据库中查询上传的文件。从我在其他文章中读到的内容来看,大多数人都认为使用文件系统进行文件存储比直接在数据库中存储二进制数据(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");
这个选项更好,但有可能会让某人上传一个从未被引用的文件到系统中。虽然可以通过“清除”或“清理文件系统”函数来删除任何未被引用的文件来解决这个问题。此选项也不允许使用数据库主键值来存储文件。
选项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,因为它很简单,我不必担心用户在文件上传之前尝试请求文件。存储空间很便宜,所以即使有一些未引用的文件占用空间,也不是世界末日。但这似乎是一个常见的问题,我想听听别人是如何解决它或者我应该考虑哪些其他方面。