要做或不做:将图像存储在数据库中[重复]

2024-05-21

在 Web 应用程序的上下文中,我的前老板总是说在数据库中放置对图像的引用,而不是图像本身。我倾向于同意在数据库中存储 url 与图像本身是一个好主意,但在我现在工作的地方,我们在数据库中存储大量图像。

我能想到的唯一原因可能是它更安全?您不希望有人直接链接到某个网址吗?但如果是这种情况,您始终可以让网站/服务器处理图像,就像 asp.net 中的处理程序一样,以便用户需要进行身份验证才能查看图像。我还认为从数据库中提取图像会损害性能。还有其他原因可以解释为什么将图像存储在数据库中是个好主意/不太好主意吗?


精确重复: 用户图像:数据库还是文件系统存储? https://stackoverflow.com/questions/585224/user-images-database-vs-filesystem-storage
精确重复: 在数据库中存储图像:是还是不是? https://stackoverflow.com/questions/3748/storing-images-in-db-yea-or-nay
精确重复: 我应该将图像存储在数据库还是文件夹中? https://stackoverflow.com/questions/713243/should-i-store-my-images-in-the-database-or-folders
精确重复: 您会将二进制数据存储在数据库或文件夹中吗? https://stackoverflow.com/questions/662488/would-you-store-binary-data-in-database-or-in-file-system
精确重复: 将图片存储为文件或网络应用程序的数据库? https://stackoverflow.com/questions/561447/store-pictures-as-files-or-in-the-database-for-a-web-app
精确重复: 存储少量图像:blob 还是 fs? https://stackoverflow.com/questions/325126/storing-a-small-number-of-images-blob-or-fs
精确重复: 将图像存储在文件系统或数据库中? https://stackoverflow.com/questions/766048/store-image-in-database-or-in-a-system-file


将图像放入数据库的优点。

  1. 交易。保存 blob 时,您可以像任何其他数据库数据一样提交它。这意味着您可以提交 blob 以及任何关联的元数据,并确保两者同步。如果磁盘空间不足?没有提交。文件未完全上传?没有提交。愚蠢的应用程序错误?没有提交。如果保持图像及其关联的元数据彼此一致对于您的应用程序很重要,那么数据库可以提供的事务可能会是一个福音。

  2. 一套系统即可管理。需要备份元数据和 blob?备份数据库。需要复制它们吗?复制数据库。需要从部分系统故障中恢复吗?重新加载数据库并前滚日志。 DB 为一般数据带来的所有优势(卷映射、存储控制、备份、复制、恢复等)都适用于您的 blob。一致性更高,管理更轻松。

  3. 安全。数据库具有可以利用的非常细粒度的安全功能。架构、用户角色,甚至“只读视图”之类的东西都可以安全地访问数据子集。所有这些功能也适用于保存 blob 的表。

  4. 集中管理。与 #2 相关,但基本上 DBA(就好像他们没有足够的权力一样)需要管理一件事:数据库。现代数据库(尤其是较大的数据库)非常适合跨多台机器的大型安装。单一管理来源简化了程序,简化了知识转移。

  5. 大多数现代数据库都能很好地处理 blob。借助数据层中对 Blob 的一流支持,您可以轻松地将 Blob 从数据库流式传输到客户端。虽然您可以执行一些操作来一次性“吸入”整个 blob,但如果您不需要该功能,则不要使用它。研究数据库的 SQL 接口并利用其功能。没有理由将它们视为“大字符串”,将它们整体处理并将您的斑点变成大的、吞噬内存、破坏缓存的炸弹。

  6. 就像您可以为图像设置专用文件服务器一样,您可以在数据库中设置专用 Blob 服务器。为它们提供专用磁盘卷、专用模式、专用缓存等。数据库中的所有数据都不相同,或者行为相同,没有理由将其配置为完全相同。好的数据库具有精细的控制水平。

从数据库提供 blob 的主要问题是确保 HTTP 层实际上利用所有 HTTP 协议来执行服务。

许多幼稚的实现只是简单地抓取 blob,然后将它们批量转储到套接字中。但 HTTP 有几个非常适合流图像等的重要功能。特别是缓存标头、ETag 和分块传输,以允许客户端请求 Blob 的“片段”。

确保您的 HTTP 服务正确处理所有这些请求,并且您的数据库可以成为非常好的 Web 公民。通过将文件缓存在文件系统中以供 HTTP 服务器提供服务,您可以“免费”获得其中一些优势(因为好的服务器无论如何都会对“静态”资源执行此操作),但请确保如果您这样做,您尊重图像的修改日期等内容。

例如,某人请求 spaceshuttle.jpg,这是 2009 年 1 月 1 日创建的图像。该图像最终会在请求日期(例如 2009 年 2 月 1 日)缓存在文件系统上。随后,该图像会从缓存中清除(先进先出策略) ,或其他什么),后来有人在 2009 年 3 月 1 日再次请求。好吧,现在它的“创建日期”是 2009 年 3 月 1 日,尽管它的创建日期实际上是 1 月 1 日。因此,您可以看到,特别是如果您的缓存周转频繁,客户端可能正在使用 If-修改后的标头可能会获取比实际需要更多的数据,因为服务器认为资源已更改,但实际上并未更改。

如果您使缓存创建日期与实际创建日期保持同步,那么这可能不是什么问题。

但重点是,为了成为“优秀的网络公民”,需要仔细思考整个问题,并为您和您的客户节省一些潜在的带宽等。

我刚刚为一个从数据库提供视频的 Java 项目经历了所有这些,一切都很顺利。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

要做或不做:将图像存储在数据库中[重复] 的相关文章

  • 社交应用程序的数据库设计和优化注意事项

    通常的情况 我有一个简单的应用程序 允许人们上传照片并关注其他人 因此 每个用户都会有类似 墙 或 活动源 的东西 他或她可以在其中看到他 她的朋友 他或她关注的人 上传的最新照片 大多数功能都很容易实现 然而 当涉及到这个历史活动源时 由
  • 对于数据库来说,选择正确的数据类型会影响性能吗?

    如果是这样 为什么 我的意思是 tinyint 的搜索速度比 int 快吗 如果是这样 性能上的实际差异是什么 是的 根据数据类型 它确实有所不同 int vs tinyint不会在速度上产生明显的差异 但会在数据大小上产生差异 假设tin
  • iOS 自定义单元格设计放在哪里? awakeFromNib 还是 cellForRowAtIndexPath?

    所以 基本上我用笔尖做了一个定制单元 希望我应用一些定制设计 比如颜色和阴影 我发现了两种应用样式的方法 awakeFromNib override func awakeFromNib super awakeFromNib Containe
  • 如何有效地从 DB2 表中删除所有行

    我有一个大约有 50 万行的表 我想删除所有行 如果我做简单的delete from tbl 事务日志已满 我不关心这种情况下的事务 无论如何我都不想回滚 我可以删除许多事务中的行 但是有更好的方法吗 如何有效地从 DB2 中的表中删除所有
  • 嵌套辅助函数和性能

    嵌套辅助函数对于使代码更易于理解非常有用 谷歌甚至建议在他们的应用程序中使用嵌套函数时尚指南 https google styleguide googlecode com svn trunk javascriptguide xml Nest
  • Neo4j Desktop DB 无法启动,状态为“KILLED”

    运行 Neo4j Desktop 版本 1 0 15 尝试启动DB导致启动失败 数据库启动失败 DB database f8950fdd 6b5f 4fea 8c9f e8457ee1da9a v3 3 1 退出 状态为 已杀 检查日志 主
  • Scrapy - 持续从数据库中获取要爬取的url

    我想不断地从数据库中获取要爬行的网址 到目前为止 我成功地从基地获取了 url 但我希望我的蜘蛛继续从该基地读取 因为该表将由另一个线程填充 我有一个管道 一旦爬行 工作 就会从表中删除 url 换句话说 我想使用我的数据库作为队列 我尝试
  • 有谁知道一种更快的方法来执行 String.Split() 吗?

    我正在读取 CSV 文件的每一行 并且需要获取每一列中的各个值 所以现在我只是使用 values line Split delimiter where line是保存由分隔符分隔的值的字符串 衡量我的表现ReadNextRow我注意到它花费
  • 在 HTML5 Javascript 中将 BlobBuilder 转换为字符串

    function blobToString blob var reader new FileReader var d reader onloadend function d callback reader result console lo
  • 使用 where 进行 select 语句时,HSQLDB 用户缺乏权限或未找到对象错误

    我的数据库使用 SQuirrel SQL 客户端版本 3 5 3 和 HSQLDB 我已经能够为其指定相应的驱动程序 内存中 并创建一个别名 我创建了一个表 CREATE TABLE ENTRY NAME VARCHAR 100 NOT N
  • 在 SQL 数据库中存储“列表”的最正确方法是什么?

    因此 我读了很多关于如何将多个值存储到一个列中是一个坏主意 并且违反了数据标准化的第一条规则 令人惊讶的是 这不是 不要谈论数据标准化 所以我需要一些帮助 目前我正在为我工 作的地方设计一个 ASP NET 网页 我想根据此人所属的 Act
  • Java 11 中使用堆栈跟踪的速度明显慢于 Java 8

    我正在比较 JDK 8 和 11 的性能jmh https openjdk java net projects code tools jmh 1 21 当我遇到一些令人惊讶的数字时 Java version 1 8 0 192 vendor
  • 基于代理的模拟:性能问题:Python vs NetLogo & Repast

    我正在 Python 3 中复制一小段 Sugarscape 代理模拟模型 我发现我的代码的性能比 NetLogo 慢约 3 倍 这可能是我的代码的问题 还是Python的固有限制 显然 这只是代码的一个片段 但 Python 却花费了三分
  • 如何加速Python中的N维区间树?

    考虑以下问题 给定一组n间隔和一组m浮点数 对于每个浮点数 确定包含该浮点数的区间子集 这个问题已经通过构建一个解决区间树 https en wikipedia org wiki Interval tree 或称为范围树或线段树 已经针对一
  • Draggable JS Bootstrap 模式 - 性能问题

    对于工作中的项目 我们在 JavaScript 中使用 Bootstrap Modal 窗口 我们想让一些窗口可移动 但我们遇到了 JQuery 的性能问题 myModal draggable handle modal header Exa
  • 如何跨多个表强制执行 CHECK 约束

    我有一个在 Microsoft SQL Server 2012 Express 中记录奶牛繁殖信息的数据库 显然 一头牛只有在出生后才能配种 并且在其一生中可能会配种多次 我需要在我的数据库中强制执行这些约束 我目前已经根据下图安排了一个架
  • 如何找到多个列中的最小值

    我在我的 DB 3 col 中有一个值 我想在所有这些值中找到一个值 如下所述 表名 MyTable id col1 col2 col3 1 200 300 400 2 100 150 300 3 800 102 20 4 80 80 0
  • 在标准化数据库模式中是否可以有多个外键?

    Address addressID houseNumber postcode roadName city county Reservation reservationID roomNo leadGuestID guest2ID guest3
  • 如何停止在 mongodb 集合中插入重复文档

    让我们有一个MongoDB包含三个文档的集合 db collection find id user A title Physics Bank Bank A id user A title Chemistry Bank Bank B id u
  • 实现软删除的最佳方法是什么?

    目前在做一个项目 我们要对大部分用户 用户角色 实现软删除 我们决定添加一个is deleted 0 数据库中每个表的字段并将其设置为 1 如果特定用户角色点击特定记录上的删除按钮 现在为了将来的维护 每个SELECT查询需要确保它们不包含

随机推荐