我做了一个小的演示网站,在上面我把图片存储在sql服务器上的一个图片列中。我有几个问题...
这是个坏主意吗?
当我的网站增长时,它是否会影响网站的性能?
另一个办法是将图像存储在光盘上,只在数据库中存储对图像的引用。这一定是很多人都遇到过的一个共同的难题。我欢迎一些建议,如果可以的话,我其实很愿意少犯一些错误。
微软研究院有一篇非常好的论文,叫做To Blob or Not To Blob。
他们在进行了大量的性能测试和分析后得出的结论是这样的。
如果你的图片或文档的大小通常低于256KB,将它们存储在数据库的VARBINARY列中会更有效率
如果你的图片或文档的大小通常超过1MB,将它们存储在文件系统中会更有效率(而且通过SQL Server 2008的FILESTREAM属性,它们仍然处于事务控制之下,是数据库的一部分)。
在这两者之间,根据你的用途,这有点像折腾。
如果你决定把你的图片放到一个SQL Server表中,我强烈建议使用一个单独的表来存储这些图片--不要把员工照片存储在员工表中--把它们放在一个单独的表中。这样一来,Employee表就可以保持精简,并且非常有效,假设你不总是需要选择雇员照片,作为你查询的一部分。
对于文件组,请查看文件和文件组结构的介绍。基本上,你要么从一开始就用一个单独的文件组来创建你的数据库,用于大型数据结构,要么以后再增加一个文件组。让我们称它为"LARGE_DATA"。
现在,只要你有一个新的表需要存储VARCHAR(MAX)或VARBINARY(MAX)列,你就可以为大数据指定这个文件组。
CREATE TABLE dbo.YourTable
(....... define the fields here ......)
ON Data -- the basic "Data" filegroup for the regular data
TEXTIMAGE_ON LARGE_DATA -- the filegroup for large chunks of data
请看MSDN关于文件组的介绍,并玩一玩。
我曾经陷入过这种两难境地,并在google上研究了不少意见。我发现确实有很多人认为将图片保存在磁盘上对较大的图片更好,而mySQL允许更容易的访问,特别是像PHP语言。
我发现一个类似的问题
https://stackoverflow.com/questions/4659441/mysql-blob-vs-file-for-storing-small-png-images
我最后的结论是,对于诸如个人资料图片,只是一个小的方形图片,需要每个用户都有,mySQL会比在hdd中存储一堆拇指要好,而对于相册之类的东西,文件夹/图像文件会更好。
希望有帮助
我更倾向于将图像存储在一个目录中,然后在数据库中存储一个对图像文件的引用。
然而,如果你确实将图像存储在数据库中,你应该将你的数据库分区,使图像列驻留在一个单独的文件中。
你可以在这里阅读更多关于使用文件组的信息http://msdn.microsoft.com/en-us/library/ms179316.aspx。