存储二进制或图片文件的最佳方式是什么?
请您解释,为什么?
答案 0 :(得分:9)
没有真正的最佳方式,只是一堆权衡。
数据库优点:
1.在集群环境中处理起来容易得多
2.不依赖文件服务器等附加资源
3.无需在负载平衡环境中设置“同步”操作
4.备份自动包含文件。
数据库缺点:
1.数据库的大小/增长。
2.根据数据库服务器和您的语言,可能很难输入和检索
3.速度/性能。
4.根据数据库服务器,您必须在上载和导出时对文件进行病毒扫描。
文件优点:
1.对于单个Web /单数据库服务器安装,它很快
2.熟悉操作文件的能力。换句话说,如果磁盘空间不足,可以很容易地将文件移动到其他位置
3.文件“静止”时可以扫描病毒。这使您可以利用扫描仪更新。
档案缺失:
1.在多Web服务器环境中,需要可访问的共享。哪个也应该聚集在一起进行故障转移
2.处理文件访问的其他安全要求。您必须小心Web服务器和/或共享不允许文件执行
3.事务备份必须考虑文件系统。
上面说过,SQL 2008有一个名为FILESTREAM的东西,它结合了两个世界。您上传到数据库,它将文件透明地存储在磁盘上的目录中。检索时,您可以从数据库中提取;或者您可以直接转到它在文件系统上的位置。
答案 1 :(得分:4)
在数据库中存储二进制文件的优点:
在数据库中存储二进制文件的缺点:
在文件系统中存储二进制文件的优点:
在文件系统中存储二进制文件的缺点:
总之,我会使用文件系统。在过去,使用SQL Server 2005,我只需将db表中的“指针”存储到二进制文件中。指针通常是GUID。
如果您正在使用SQL Server 2008(也许还有其他人 - 我不知道),这是个好消息:内置支持使用新的VARBINARY(MAX)FILESTREAM数据类型的混合解决方案。这些行为在逻辑上类似于VARBINARY(MAX)列,但在幕后,SQL Sever 2008会将数据存储在文件系统中。
答案 2 :(得分:2)
没有最好的办法。
什么?您需要更多信息吗?
我知道有三种方式......一种是数据库中的字节数组。二,作为文件存储在数据库中的路径。三,作为混合(仅当DB允许时,例如FileStream类型)。
第一个非常酷,因为您可以在同一步骤中查询和获取数据。这总是很好。但是当你有很多文件时会发生什么?你的数据库变大了。现在,您必须处理大型数据库维护问题,例如备份超过1 TB的数据库的试验。如果您需要外部访问文件会发生什么?如类型转换,大规模操作(调整所有图像大小,应用水印等)?它比你有文件要困难得多。
第二个对于大量文件很有用。您可以将它们存储在NAS设备上,逐步备份它们,保持数据库小等等。但是,当您有大量文件时,就会开始遇到文件系统中的限制。如果你将它们传播到网络上,就会出现延迟问题,用户权利问题等。另外,如果您的网络被重新安排,我会对您表示同情。现在你必须在数据库上运行大量更新来改变你的文件位置,如果有什么东西搞砸了,我会很同情你。
然后是混合选项。它几乎是完美的 - 您可以通过查询获取文件,但您的数据库并不大。这会解决你所有的问题吗?可能不是。您的数据库不再可移植;你被锁定在特定的DBMS上。而这些东西还不成熟,所以你可以享受出牙过程。谁说这解决了所有不同的问题?
事实是,没有“最好”的方式。你只需要确定你的要求,根据它们做出最好的选择,然后当你弄清楚你做错了什么时就把它吸了。
答案 3 :(得分:0)
我喜欢将图像存储在数据库中。只需更改数据库(无复制文件),即可轻松从开发切换到生产。数据库可以像文件系统一样跟踪创建/修改日期等属性。
答案 4 :(得分:0)
出于性能目的,我个人从未将图像存储在数据库中。在我的所有网站中,我都有一个“/ files”文件夹,我可以根据我要存储的图像放置子文件夹。然后我按惯例命名它们。
例如,如果我存储个人资料图片,我会将其存储在“/ files / profile /”中作为profile_2.jpg(如果2是帐户的ID)。我总是规定将服务器上的图像调整到我需要的最大尺寸,然后再根据需要调整尺寸。所以我要保存“profile_2_thumb.jpg”和“profile_2_full.jpg”。
通过为自己创建规则,您只需在代码中调用img src =“/ files / profile__thumb.jpg”
无论如何我都是这样做的!