【问题标题】:which one is a more scalable solution for managing image files哪个是用于管理图像文件的更具可扩展性的解决方案
【发布时间】:2023-04-02 16:14:01
【问题描述】:

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

这是我的选择。

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

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

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    您应该使用混合解决方案。

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

    我已经看到了实现这一点的各种方法。但通常它们是主键 + 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,他们有很棒的体验。然而,我没有太多机会看一看..所以我不能就此提供任何建议。

    【讨论】:

    • 能否请您扩展最后一行?我还添加了一个选项。谢谢
    • 我已经扩展了一点。它为您提供了我的意思的基本轮廓。
    【解决方案2】:

    不要重新发明轮子。

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2012-06-28
        • 2011-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多