2

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

这是我的选择。

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

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

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

3)将图像存储在 nosql 数据库中。 只是把这个扔在那里。我对 NoSql 不太熟悉。

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

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

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

4

3 回答 3

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,他们有很棒的体验。然而,我没有太多机会去看..所以我不能就此提供任何建议。

于 2013-10-06T21:59:04.170 回答
0

Don't reinvent the wheel.

Image Resizing for .Net has pretty much everything you could think of. Caching, cloud plugins, API and a huge community + associated support.

There are a variety of methods to optimize performance and it's easy to switch from one provider to another say S3 to Azure; take a look at that product (it has a nuget package) if you have a chance.

于 2013-10-07T06:55:20.657 回答
0

如果您的项目不在 Azure 中,最好将文件保存在文件系统中。但是,如果您的项目已经位于 Azure 中,那么您最好使用 blob 的容器来存储您的文件。比较文件的存储位置:在数据库中还是在文件系统中,答案是:最好使用文件系统,因为它的工作速度更快,而且由于大量的图像,您的数据库不会增长。

于 2013-10-08T13:39:45.587 回答