使用SQL数据库跟踪外部文件,并在删除记录时删除外部文件

|| 我不知道我是否正在按照正确的方式进行操作,或者我正在完全愚蠢地进行操作。 我有一个文件系统,它将容纳一堆图像文件。这些是可变大小的大地图图像。我正在使用数据库对它们进行空间查询。 基本上,我要做的就是能够将图像的信息(名称,目录和空间信息)添加到数据库中,并从数据库中删除图像(所有表中的记录以及与此相关的外部文件)记录)。我知道如何删除所有记录,但不删除外部数据。我不想将图像作为二进制Blob插入数据库,因为我经常在文件上使用外部工具。 基本上,我的数据库仅跟踪文件的名称和目录以及与文件关联的空间数据。 从数据库库中删除记录时,如何从文件系统中删除文件? 我什至正在正确地做这件事?将图像作为二进制Blob插入数据库是否更正常? (复制数据的开销使我难以置信,因此必须有更好的方法。) 我希望这是无关紧要的,但是我将postgre用作Linux下的SQL数据库。 编辑:我当前的策略是使用处理图像删除的shell脚本。在shell脚本期间,它使事务文件删除与该映像关联的所有数据库记录,同时将文件的完整路径保存为纯文本文件。如果交易成功,则删除平面文件中的图像。这明智吗?有没有更好的办法?     
已邀请:

bab

        您的“当前策略”听起来像是我的标准方法:从数据库中删除,如果成功(这是很大的“如果”),请删除相应的图像文件。您可能希望使用健全性检查器来确保您不会堆积残骸,只是对数据库和文件系统进行简单比较,以确保它们彼此一致。 您不需要将图像存储在数据库中,文件系统非常擅长处理文件,将它们包含在文件系统中可能会更加方便。而且,正如下面的David Ryder所指出的那样,处理大型图像文件的文件系统几乎肯定比数据库要快得多:文件系统非常擅长处理文件,这就是它们的作用。 更新:如果您真的需要快速,那么您可以尝试使用cron作业删除文件。每隔几个小时(或一天或其他任何工作)一次,cron作业可以将数据库与文件系统进行比较,并删除任何杂散图像。这将使从数据库中进行大规模删除变得更加容易:您可以执行
DELETE FROM whatever WHERE ...
杀死多个条目,然后您的管理员将随后来清理剩余的图像。     
        在很大程度上取决于您要放置图像的位置。 由于数据库通常需要快速的随机IO,因此您需要将其放在带有一些备用电池RAID10控制器的盒子中。 但是,提供大量静态(不经常更新)文件的网络服务器将需要完全不同的硬件,可能是RAID6或廉价服务器云。 因此,您必须在设计中考虑到这一点。 1)ON DELETE触发 您可以让数据库通过ON DELETE触发器删除文件。大问题:如果回滚事务,文件将保持删除状态! 2)日志表 ON DELETE触发器在日志表中插入已删除的图像记录。 cron作业会读取此内容,并在以后删除文件。 ==>没有回滚问题 3)垃圾收集 cron作业将比较磁盘上的文件列表和数据库的内容,并删除没有匹配的数据库记录的磁盘文件。 这是安全的,但可能比日志表要慢得多! 4)在应用程序中做: DELETE RETURNING返回已删除记录的列表,COMMIT 从文件系统删除 失效点: 如果您的应用程序死了,则可能会获得没有数据库记录的文件,如果将COMMIT放在unlink()之后,则可能会得到相反的记录,这会更糟。 同样的情况也适用于INSERT ... 如果应用程序从数据库中删除了其他内容,则不会对其进行处理。     
        有一个PHP函数可以从文件系统中删除文件:
unlink(filename)
    
从数据库库中删除记录时,如何从文件系统中删除文件? 您可以使用pl / perlu脚本执行此操作。但是,如果文件未存储为lob,则不要这样做。考虑如果发生错误并且事务被回滚,将会发生什么情况。 操纵文件系统的正确方法是在应用程序中进行操作-一旦100%确定数据库中文件的详细信息已正确设置/取消,就不会再有错误和回滚的可能性。     

要回复问题请先登录注册