Eri*_*tas 21 database file-storage
我正在研究一种将文件存储在文件系统中的软件,以及对数据库中这些文件的引用.因此,可以在数据库中查询上载的文件,而无需访问文件系统.从我在其他帖子中看到的内容来看,大多数人都说最好使用文件系统进行文件存储,而不是将二进制数据直接存储在数据库中作为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);
Run Code Online (Sandbox Code Playgroud)
此选项会有问题,因为在实际文件之前添加了对文件的引用,因此另一个用户可能会在文件实际存储到系统之前尝试下载文件.尽管如此,因为在存储文件之前可以使用对主文件的引用来创建对文件的引用.
选项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");
Run Code Online (Sandbox Code Playgroud)
此选项更好,但可以让某人将文件上传到从未引用的系统.虽然这可以通过"清除"或"清理UFFileSystem"功能来修复,但删除任何未引用的文件.此选项也不允许使用数据库中的主键值存储文件.
选项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");
Run Code Online (Sandbox Code Playgroud)
此选项允许在上载文件之前创建主键,但也可以防止其他用户在上载文件之前获取对文件的引用.虽然,有可能永远不会上传文件,并且文件引用将被挂起.然而,从数据库中清除待处理的引用也是相当简单的.
我倾向于选项2,因为它很简单,我不必担心用户在上传之前尝试请求文件.存储是便宜的,所以如果我最终得到一些未引用的文件占用空间,它不是世界末日.但这似乎也是一个常见的问题,我想听听其他人如何解决它或我应该做的其他考虑.
我想提出另一种选择。使文件名始终等于其内容的哈希值。然后,您可以随时安全地编写任何内容,前提是您在其他地方添加对它的引用之前执行此操作。
由于内容永远不会改变,因此永远不会出现同步问题。
这为您免费提供重复数据删除。但删除变得更加困难。我建议每晚进行垃圾收集过程。