将图像从数据库移动到文件系统

将图像从数据库移动到文件系统

因此,目前在我们的系统中,我们一直将图像文件存储在数据库(SQL Express 2005)中。不幸的是,我们并没有意识到这会达到 SQL Express 许可证允许的最大数据库大小。因此,我提出了一个计划,将图像存储在文件系统中,并仅索引文件在数据库中的位置。

计划是将根路径保存在我们的 OptionsTable 中ImagesRoot,然后只保存表中的实际 imageID,这基本上是来自图像记录的 PK 的 FK。我已经确定最好将其拆分为基于ImagesRoot每 1000 张图像的子目录,因此基本上是 (ImagedID / 1000)\(ImageID % 1000)(例如,ImageID 为 1999,它将位于 %ImageRoot%\1\999)。

我正在寻找这个系统的任何潜在缺陷以及任何可以改进的地方,因为我已经收到了公司老板的反对,他们希望一切都记录在数据库中。沿着这个思路,我也会考虑原因为什么它应该全部在数据库中。

我应该提到我们已经为所有客户的数据库和我们的程序生成的需要在一段时间内保存的任何文件设置了自动备份,这些都是可选的,但如果有人不使用我们的系统,则预计他们会使用自己的系统,或者数据丢失不是我们的问题(如果我们的系统出现故障并且他们正在使用它!)。

谢谢

编辑

有人建议使用 2008 R2 来解决这个问题。这是一个好主意,我只需要研究使用这些数据库的遗留程序的问题。并非所有程序都使用存储过程,有些程序的维护性不是很好。

答案1

如果您要像那样分解目录结构(您应该这样做),则不应使用您建议的方法,因为这种方法容易出现聚类。您应该实现相同的概念,但基于文件名的哈希值。

例如,不按照您的建议,对文件名进行哈希处理(我将使用 md5),然后根据哈希值创建子目录:

Your proposal:
FILE=1999, H1=1, H2=999, FILEPATH=1\999\1999
FILE=1998, H1=1, H2=998, FILEPATH=1\998\1998
FILE=1997, H1=1, H2=997, FILEPATH=1\997\1997

Hashed solution:
FILE=1999, MD5=2554fe5cd0a1b3fb7f9ec112fd326744, H1=2, H2=54, FILEPATH=2\54\1999
FILE=1998, MD5=82ec15656dd2b8a3e50ff36643a713ad, H1=8, H2=2e, FILEPATH=8\2e\1998
FILE=1997, MD5=9cc2e1e538bd538014d294138a85e20b, H1=9, H2=cc, FILEPATH=9\cc\1997

这样做的好处是它可以更均匀地分散文件夹的利用率,让您可以执行诸如将文件夹分布在驱动器上以提高性能等操作。

您的数据库可能具有内置的散列函数,可以让您动态计算路径,您也可以轻松地在代码中计算一次并保存整个路径。

我举的 MD5 例子可能不是标准(我认为 SHA1 更常见),但它只是为了得到一个可行的例子。

答案2

将所有东西(主要是图像和文件)放入数据库的主要原因是出于保护问题。在这种情况下,保护是指访问控制,以保护版权内容。通过这种方式,您可以控制谁在何时查看/访问了特定资源并对其进行跟踪,并且通过登录程序,您还可以决定谁有权访问这些资产。

答案3

为什么在 R2 中达到了最大数据库大小(10gb)?

  • 创建一个新的文件组,使用文件系统存储来存储数据。
  • 瞧,完成了。

存储在文件系统中的 BLob 不计入大小限制。

关于这个非常好的功能的更多信息:

http://technet.microsoft.com/en-us/library/bb933993.aspx

相关内容