【问题标题】:ASP.NET MVC image upload store location (db vs filesystem)ASP.NET MVC 图像上传存储位置(数据库与文件系统)
【发布时间】:2011-02-13 12:10:56
【问题描述】:

我正在使用 ASP.NET MVC + NHibernate + Postres 堆栈编写 Web 应用程序。我想知道上传的图像是否应该作为二进制 blob 存储在数据库中或文件系统中(并且仅在 db 中引用)。 我能想到的数据库存储的一个优点是可以轻松备份/恢复所有数据,而无需恢复到文件系统复制工具。另一方面,我怀疑文件系统访问可能更快(但尤其是在处理许多并发请求时?) 你有什么建议?

【问题讨论】:

标签: asp.net asp.net-mvc postgresql nhibernate architecture


【解决方案1】:

我会同时做这两个 - 确保图像存储在数据库中,以便所有数据集中以便于备份,但也将数据缓存在外部,这样对大图像的重复请求就不会破坏缓冲区缓存数据库。正确完成后,您可以引入新的前端 Web 服务器,这些服务器将在启动后透明地从数据库中填充其本地图像缓存。

集中存储图像对于确保在具有多个 Web 服务器的系统中为图像发送良好的 Last-Modified 和 ETag HTTP 响应标头也很有用,因为这些标头可以从数据库内容中生成,而不是从本地缓存对象。

只是 PostgreSQL 的一个实现说明:您可以将包含图像数据的列的“存储模式”设置为“外部”:这将阻止 PostgreSQL 尝试压缩图像数据(使用 zlib,这不太可能提供任何好处)并将使其将图像数据存储在辅助 TOAST 表中,如果您只是查询图像元数据,则可以提供更好的性能。参见ALTER TABLE 命令的“SET STORAGE”子句,例如:

ALTER TABLE media.image ALTER COLUMN content SET STORAGE EXTERNAL

【讨论】:

    【解决方案2】:

    我们利用数据库中的原始存储进行备份,但生成的缩小图像缓存在网络服务器的文件系统中。

    但是,如果可能,我们会尽量避免到数据库的任何往返,因为它会产生巨大的负载,因为一个页面通常会在每个页面视图中调用多个图像请求。

    关于在数据库中存储 blob 的注意事项,我建议您将实际的 blob 列存储在专用表中,并与您的一个/多个实体进行一对一的映射。这将简化备份以及更改您的表格。当表变大时,任何更改都将“永远”完成,锁定是一个大问题,即使在备份期间也是如此。

    如果您拥有有关图像的所有信息(二进制数据除外),则选择该数据不会受到影响,除非您需要二进制数据(您很少需要,因为它将被缓存在文件系统中)。

    只要我的两分钱。

    【讨论】:

    • 不同的数据库有不同的存储 blob 的方法:postgresql 会自动将较大的 bytea 值离线存储在单独的“toast”表中,因此无需显式执行此操作。
    • 事实上,为了存储图像数据,最好使用“alter table ... alter column ... set storage external”来强制离线存储并禁用压缩。
    • 嗯,这很奇怪,因为我们使用 postgres,而且在更改表和备份表时,我遇到了表锁定问题。
    • 更改表通常需要对表对象本身进行排他锁。最坏的情况是某种涉及每一行的更改表或更新语句,这将不得不复制所有表数据。因此,如果与之关联的数据经常更改,则将 bytea 存储在单独的一对一表中是有意义的。
    【解决方案3】:

    这取决于。您是否重视能够直接链接到图像,还是希望始终使用服务器端资源调用数据库,然后为图像写入二进制数据?

    【讨论】:

      猜你喜欢
      • 2014-05-04
      • 1970-01-01
      • 1970-01-01
      • 2012-06-26
      • 2014-06-09
      • 1970-01-01
      • 2012-06-29
      • 2013-05-04
      • 1970-01-01
      相关资源
      最近更新 更多