Sql server 使用sqlserver作为图像存储

Sql server 使用sqlserver作为图像存储,sql-server,image,store,Sql Server,Image,Store,SQLServer2008是作为电子商务网站的图像存储的好选择吗?它将用于存储各种大小和角度的产品图像。web服务器将输出这些图像,通过集群ID读取表。图像总大小约为10GB,但需要扩展。我看到使用文件系统有很多好处,但我担心SQL server没有O(1)查找功能并不是最好的解决方案,因为该站点有很多流量。那会是一个瓶颈吗?有什么想法,或者其他选择吗?对于电子商务网站之类的东西,我可能会选择将图像存储在数据库的blob存储中。虽然您不想过早地进行优化,但让我的图像与我的数据一起方便地组织起来,

SQLServer2008是作为电子商务网站的图像存储的好选择吗?它将用于存储各种大小和角度的产品图像。web服务器将输出这些图像,通过集群ID读取表。图像总大小约为10GB,但需要扩展。我看到使用文件系统有很多好处,但我担心SQL server没有O(1)查找功能并不是最好的解决方案,因为该站点有很多流量。那会是一个瓶颈吗?有什么想法,或者其他选择吗?

对于电子商务网站之类的东西,我可能会选择将图像存储在数据库的blob存储中。虽然您不想过早地进行优化,但让我的图像与我的数据一起方便地组织起来,并且非常便于携带,这是电子商务之类的自动好处。

如果图像被索引,那么查找将不会是一个大问题。我不确定,但我不认为文件系统的查找是O(1),更像O(n)(我不认为文件是由文件系统索引的)


在这种设置中,让我担心的是数据库的大小,但如果管理正确,这不会是一个大问题,而且一个大的优点是,您只需要备份一件事(数据库),而不必担心磁盘上的文件。

10 Gb的数据量不是很大,因此您可能可以使用数据库来存储它,并且不会有大的问题,当然,从性能角度来看,最好使用文件系统,从安全管理角度来看,最好使用DB(备份和一致性)

幸运的是,Sql Server 2008允许您既有蛋糕,也有蛋糕,包括:

在SQLServer2008中,您可以将FILESTREAM属性应用于varbinary列,然后SQLServer将该列的数据存储在本地NTFS文件系统中。将数据存储在文件系统上带来两个关键好处:

  • 性能与文件系统的流性能相匹配
  • BLOB大小仅受文件系统卷大小的限制
但是,该列可以像SQL Server中的任何其他BLOB列一样进行管理,因此管理员可以使用SQL Server的可管理性和安全性功能将BLOB数据管理与关系数据库中的其余数据集成在一起,而无需单独管理文件系统数据

在SQL Server中将数据定义为FILESTREAM列还可以确保数据库中的关系数据与物理存储在文件系统中的非结构化数据之间的数据级一致性。FILESTREAM列的行为与BLOB列完全相同,这意味着完全集成了维护操作(如备份和恢复)、与SQL Server安全模型的完全集成以及完全的事务支持

应用程序开发人员可以通过以下两种编程模型之一处理FILESTREAM数据:;他们可以像使用标准BLOB列一样使用Transact-SQL访问和操作数据,也可以使用带有Transact-SQL事务语义的Win32 streaming API来确保一致性,这意味着他们可以像与文件系统上的文件交互时一样,使用对FILESTREAM BLOB的标准Win32读/写调用


在SQL Server 2008中,FILESTREAM列只能在本地磁盘卷上存储数据,FILESTREAM列不支持透明加密和表值参数等某些功能。此外,尽管支持日志传送,但您不能在数据库快照或数据库镜像会话中使用包含FILESTREAM列的表。

通常,一个好的解决方案是将映像本身存储在文件系统中,并将元数据(文件名、维度、上次更新时间、您需要的任何其他内容)存储在数据库中


话虽如此,却没有“正确”的解决方案。

请查看MS Research()的白皮书

他们详细说明了你要找的东西。简短的版本是,与在文件系统上保存数据相比,任何超过1 MB的文件大小都会开始降低性能。

我怀疑查找的
O(log n)
是否会有问题。你说你有10GB的图像。假设平均图像大小为50KB,则为200000个图像。在表中对200K行执行索引查找不是问题。与实际从磁盘读取图像并通过应用程序传输到客户端所需的时间相比,这将是很小的

与在数据库中将路径存储到文件系统上的文件相比,将图像存储在数据库中通常的优缺点仍然值得考虑。例如:

  • 数据库中的图像遵守事务隔离,删除行时自动删除,等等
  • 具有10GB图像的数据库当然比只存储图像文件路径名的数据库要大。备份速度和其他因素是相关的
  • 当您通过应用程序从数据库提供图像时,需要在响应上设置MIME头
  • 文件系统上的映像更容易由web服务器缓存(例如Apache mod_mmap),或者可以由更精简的web服务器(如lighttpd)提供服务。这实际上是一个很大的好处

对此没有“正确”的解决方案。。直到2008年。请参阅其他答案-SQL 2008对此有一个新的构造-FILESTREAM。一个典型的图像有多大(以Kb为单位)?最大的1%有多大?图像的潜在大小有上限吗?你的最后一点其实很重要。考虑移动图像到S3或CDN之类的异地存储的情况,也可以查看另一个可以帮助的工具。在响应端,它是Apache的一种代理。有趣!本文最后一次更新是在2006年6月,仅适用于SQLServer2005