我正在研究将文件存储在文件系统中的软件,以及对数据库中这些文件的引用。查询上传的文件可以在数据库中完成,而无需访问文件系统。根据我在其他文章中阅读的内容,大多数人认为最好使用文件系统进行文件存储,而不是直接将二进制数据作为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,因为它很简单,而且我不必担心用户在上传文件之前请求文件。存储是便宜的,所以如果我最终得到一些未引用的文件占用空间,那么它不是世界末日。但这似乎也是一个常见问题,我想听听其他人是如何解决它或我应该做的其他考虑。
很聪明的问题。许多人从不考虑他们不同的数据存储之间的一致性。 – usr 2013-03-15 19:01:08