哪个是用于管理图像文件的更具可扩展性的解决方案

时间:2013-10-06 21:52:39

标签: c# asp.net sql-server windows

我需要能够支持用户图片上传和下载/查看图片。

这是我的选择。

1)将图像存储在sql数据库中。

我已经看到这项工作用于小型设置。随着规模的增加,数据库成本会更高。 备份会更容易。无法利用缓存或CDN。

2)将图像存储在文件系统中。 我看到这个选项比一个小的设置稍大一些很麻烦。很难管理包含大量文件的目录。将不得不提出一些散列算法,以确保目录中有一些图像,目录只包含几个目录。不知道Windows中是否存在创建深层目录结构的限制。可以使用缓存。

3)将图像存储在nosql DB中。 把它扔到那里。我对NoSql不太熟悉。

4) Windows Azure存储/亚马逊存储。

一些事情。 1)金钱是一个重要因素。 2)windows是首选环境,但linux / apache解决方案还可以。

还有一件事。 Facebook会做什么?或者。 再次感谢。

3 个答案:

答案 0 :(得分:2)

你应该采用混合解决方案。

将实际二进制图像存储在文件系统上,但使用数据库存储图像元数据。这为您提供了一个更简单的媒体来提供文件 - 允许可扩展性和提供服务的速度,同时还具有搜索,过滤等数据库的速度。

我已经看到了实现这个的各种方法..但通常它们是主键+ mime类型+目录绑定到文件名/文件夹。例如,/simon-whitehead/albums/stackoverflow/目录中文件名为1013.jpg的照片就像它在数据库中的表一样:

Id - 1013
Name - example.jpg
AlbumId - (Stackoverflow album id)
UserId - (my user id)
Lat - 37.81
Long - 144.96
Date - 7/10/2013
Mime type - image/jpeg

您甚至可能有一个将标签连接到图像的联结表(用于搜索)。然后,你基本上建立这样的响应:

file = getuser(userId).name / getalbum(albumId).name / getimage(imageid).name
编辑:我看到你现在添加了Azure。我会说我工作的一家公司使用Azure,他们有很棒的体验。然而,我没有太多机会看看..所以我不能就此给出任何建议。

答案 1 :(得分:0)

不要重新发明轮子。

Image Resizing for .Net几乎有你能想到的一切。缓存,云插件,API和庞大的社区+相关支持。

有多种方法可以优化性能,并且很容易从一个提供商切换到另一个提供商,比如S3到Azure;如果有机会,请查看该产品(它有一个nuget包)。

答案 2 :(得分:0)

如果您的项目不在Azure中,最好将文件保存在文件系统中。 但是,如果您的项目已经位于Azure中,那么您最好使用blob的容器来存储文件。 比较存储文件的位置:在数据库或文件系统中,答案是: 最好使用文件系统,因为它可以更快地运行,并且由于图像数量庞大,数据库也不会长大。