从数据库中删除文件和相应的条目

时间:2009-11-16 00:24:47

标签: database web-applications file

我有一个处理文件管理的网站。用户可以上传文件,添加说明,编辑和删除。这种情况的最佳做法是什么?

  1. 我将文件存储在文件系统中。

  2. 我该如何处理删除文件?在这种情况下,我必须删除实体:文件和数据库中的条目。第一种情况是我删除文件,如果没有错误,我从数据库中删除条目。但是如果无法删除数据库中的条目,我无法恢复我的文件。所以第二个场景是oposite:首先从数据库进入,然后是文件。但同样,当文件无法删除时,我无法恢复db中的条目。哪种方法更好?或者还有其他吗?

  3. 我认为这个问题对于所有网络编程语言和所有数据库引擎都是通用的。但是,假设我有MySQL和PHP,因此无法从数据库存储过程中删除该文件。

5 个答案:

答案 0 :(得分:4)

我通常最好选择soft deletes,尤其是数据库中的数据。

这样做可以简单地将文件放在新位置以表示它被删除,并将数据库中的条目标记为已删除。如果由于某种原因导致数据库删除失败,则允许您仍然使用该文件。

将文件放在新位置后,您可以将该位置备份到其他位置,也可以设置一些内容以定期从该位置删除项目。

答案 1 :(得分:2)

这是一种可能性。

您可以先将文件移至“已删除”文件夹,然后删除数据库中的条目。如果失败,请从“已删除”文件夹中恢复该文件。

要删除“已删除”文件夹中的文件,请在删除数据库条目后立即执行此操作。如果失败,那么您最终会在“已删除”文件夹中找到孤立文件...根据您的要求,这可能不是问题。

另一个选择是进行一次调用(可能在SessionEnd或服务上)来清理数据库。

答案 2 :(得分:1)

我个人会确保数据库获得优先级,因为它对系统更为重要。所以我确保删除db行,然后删除该文件。如果文件删除失败,我会让它无声地失败。然后我会有一个cronjob检查所有文件,如果他们有他们的数据库对应,如果没有,标记他们删除,所以系统保持干净和连贯。

答案 3 :(得分:0)

通常存在垃圾收集阶段,实际上您的数据库具有类似的“事务日志”,它可以用来倒回或播放事务。

对于文件删除,您将有一个定期运行的清理过程(可能是在发生崩溃时手动运行,或者每隔一段时间自动运行),它将磁盘上的内容与数据库中的内容进行比较并做出适当的修正。

为了使任何操作成为“原子”,必须有一种在发生碰撞时进行清理的方法。关键是要找到一种能够持续清理的方法,以便“原子”操作中任何一点的失败都不会使系统无法恢复。

答案 4 :(得分:0)

Vista引入了Transactional NTFS,它允许您将文件系统操作和数据库操作包装到一个事务中,如果失败则可以回滚。这不是.Net 3.5,我不知道它是否会成为.Net 4.0的一部分,但有证据表明它现在可以通过一些腿部工作,即使用Win32调用(参见this article

我对PHP中的事务管理一无所知。