加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

保持我的数据库和文件系统同步

发布时间:2020-12-12 16:43:59 所属栏目:MsSql教程 来源:网络整理
导读:我正在开发一种将文件存储在文件系统中的软件,以及对数据库中这些文件的引用.因此,可以在数据库中查询上传的文件,而无需访问文件系统.从我在其他帖子中读到的内容,大多数人说最好使用文件系统进行文件存储,而不是将二进制数据直接存储在数据库中作为BLOB. 所
我正在开发一种将文件存储在文件系统中的软件,以及对数据库中这些文件的引用.因此,可以在数据库中查询上传的文件,而无需访问文件系统.从我在其他帖子中读到的内容,大多数人说最好使用文件系统进行文件存储,而不是将二进制数据直接存储在数据库中作为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,因为它很简单,我不必担心用户在上传文件之前尝试请求文件.存储是便宜的,所以如果我最终得到一些未引用的文件占用空间,这不是世界的尽头.但这似乎也是一个常见的问题,我想听听别人如何解决这个问题或者其他的考虑.

解决方法

我想提出另一个选择.使文件名始终等于其内容的哈希值.然后,您可以随时写任何内容,前提是您在其他地方添加引用之前,您都可以这样做.

由于内容永远不会改变,从来没有同步问题.

这样可以免费重复数据删除.删除变得越来越难.我推荐一个夜间垃圾收集过程.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读