所以我使用大量的图像存储在数据库中的应用程序。 您如何看待这种观点? 我更多的是类型来存储在文件系统中的位置,不是直接在数据库中存储它的。
你认为什么优点/缺点?
所以我使用大量的图像存储在数据库中的应用程序。 您如何看待这种观点? 我更多的是类型来存储在文件系统中的位置,不是直接在数据库中存储它的。
你认为什么优点/缺点?
我负责的是管理图像的多TB一些应用。 我们发现,在数据库中存储文件的路径是最好的。
有几个问题:
与大多数的问题,它并不像听起来那么简单。 有情况下,这将是有意义的图像存储在数据库中。
在另一方面也有相关的问题
文件存储。 Facebook的工程师有一个伟大的讲了。 一个带走是知道文件的目录中的实际限制。
大海捞针:照片百亿高效的存储
这可能是一个有点长镜头,但如果你使用(或使用计划)SQL Server 2008中,我建议在看看新的FileStream数据类型。
的FileStream解决了大多数的存储左右在数据库中的文件的问题:
然而SQL的“透明数据加密”不加密的FileStream对象,因此,如果这是一个考虑因素,你可能会更好只是将它们存储为varbinary。
从MSDN文章:
Transact-SQL语句可以插入,更新,查询,搜索和备份FILESTREAM数据。 Win32文件系统接口提供流对数据的访问。
FILESTREAM使用用于缓存文件数据的NT系统缓存。 这有助于减少FILESTREAM数据可能对数据库引擎性能产生任何影响。 在SQL Server缓冲池没有使用; 因此,该存储器可用于查询处理。
在DB文件路径肯定是要走的路-我听说过的故事客户故事,它变成了试图图像的任何显著量存储在DB的噩梦图像的TB之后-独自打的表现实在是太多了。
根据我的经验,有时最简单的办法是根据主键来命名的图像 。 所以这是很容易找到属于一个特定的记录,反之亦然图像。 但在同一时间你不存储有关在数据库中的图像什么 。
这里的技巧是不能成为一个狂热者。
这里有一点要注意的是,没有人在亲文件系统阵营列出特定的文件系统。 这是否意味着一切从FAT16到ZFS轻而易举地打败所有的数据库?
没有。
事实是,许多数据库击败众多的文件系统,即使我们只谈论原始速度。
正确的行动当然是让你精确的情况下正确的决定,而要做到这一点,你需要一些数字和一些使用情况的估计。
在那里你必须保证引用完整性和ACID合规的地方,在数据库中存储的图像是必需的。
你不能transactionaly保证有关存储在数据库中的图像的图像和元数据指的是同一个文件。 换句话说,它是不可能保证在文件系统中的文件被永远只能在同一时间,在同一交易作为元数据改变。
正如其他人所说SQL 2008配备了一个文件流类型,可让您的文件名或标识符存储在一个数据库中的指针,并自动存储在文件系统的图像这是一个伟大的场景。
如果你是一个较旧的数据库上,那么我会说,如果你把它作为BLOB数据,那么你真的不会得到什么,在搜索功能的方式的数据库,因此它可能是最好的存储在文件系统上的地址,并存储图像的方式。
这样,你也节省您的文件系统空间,因为你只打算节省空间的确切数额,或在文件系统中,即使压缩空间。
此外,你可以决定某些结构或允许您浏览文件系统中的原始图像,而无需任何数据库访问,或批量传送文件到另一个系统,硬盘驱动器,S3或另一种情况元素保存 - 在更新位置你的程序,但是却没有一个命中试图把这些图片,你的数据库的努力来增加存储时的保持结构,再次。
也许,这也将让你抛出一些caching元素,通常打图像的URL根据到您的Web引擎/节目,所以你有自己节省为好。
小静态图像(不超过两兆多)不经常修改,应存放在数据库中。 这种方法有几个好处,包括更容易的可移植性(图像与数据库转移),更方便的备份/恢复(图像备份与数据库)和更好的可扩展性(文件系统文件夹与成千上万的小缩略图文件听起来像是一个可伸缩性噩梦我)。
从数据库服务了图像很容易,只要实现一个供应来自DB服务器返回的二进制流的字节数组的HTTP处理程序。
下面是关于该主题的有趣的白皮书。
在数据库或文件系统的大型对象存储:成团块或不BLOB
答案是“这取决于”。 当然,这将取决于数据库服务器及其Blob存储方法。 这也取决于数据的类型存储在斑点,以及这些数据是如何被访问。
更小尺寸的文件可以高效地存储和使用数据库作为存储机制交付。 更大的文件,可能会使用文件系统,特别是如果他们将被修改/更新往往最佳存储。 (BLOB碎片成为性能有关的问题。)
这里有一个额外的点要牢记。 一个配套使用数据库来存储斑点的原因是符合ACID。 然而,在白色的纸张中使用的测试器的方法,这增加了一倍SQL Server流量(SQL Server中,批量记录选项),有效地改变了“d”在ACID为“d”的二进制大对象数据没有与记录最初的交易写道。 因此,如果完全符合ACID是为您的系统的重要要求,减半SQL Server流量数据进行数据库比较文件I / O数据库BLOB I / O时写道。
我还没有看到任何人提及,但还绝对是值得注意的一件事是,有与存储大量图像的大多数文件系统过相关的问题。 例如,如果你把上面提到的方法,并将其命名主键后每个图像文件,在大多数文件系统中你会遇到的问题,如果你试图把所有的图像在一个大的目录一旦你达到一个非常大的数字图像(例如,在几十万或上百万)。
一旦这种常见的解决方案是凑出来到子目录的平衡树。
东西没有人提到的是,DB保证原子操作,事务完整性并处理并发。 甚至指称诚信是出了文件系统的窗口 - 所以你怎么知道你的文件名是真的还是正确的吗?
如果你有你的图像在一个文件系统和有人读取文件,你正在写一个新的版本,甚至删除文件 - 会发生什么?
我们使用的斑点,因为他们更容易管理(备份,复制,转移)了。 他们为我们工作。
The problem with storing only filepaths to images in a database is that the database's integrity can no longer be forced.
If the actual image pointed to by the filepath becomes unavailable, the database unwittingly has an integrity error.
Given that the images are the actual data being sought after, and that they can be managed easier (the images won't suddenly disappear) in one integrated database rather than having to interface with some kind of filesystem (if the filesystem is independently accessed, the images MIGHT suddenly "disappear"), I'd go for storing them directly as a BLOB or such.
在我曾经工作的一家公司,我们存储的1.55亿图像用于Oracle 8i(当时9I)数据库。 7.5TB的价值。
通常情况下,我storngly反对把你的基础设施(数据库)的最昂贵和最难的部分扩展,并把所有的负载进去。 在另一方面:它大大简化了备份策略,尤其是当你有多个Web服务器和需要以某种方式保持同步的数据。
像大多数其他的事情,这取决于预期的大小和预算。
我们已经实现了存储所有它的图像SQL2005 BLOB字段的文档成像系统。 有数百GB的那一刻,我们看到出色的响应时间和很少或没有性能下降。 此外,FR合规性,我们有档案馆新发布的文件的光盘库系统暴露他们作为一个标准的NTFS文件系统的中间件层。
我们已经很高兴的结果,特别是关于:
如果这是一个基于Web的应用程序,然后可能会有优势,存储第三方存储交付网络上的图像,如Amazon的S3和Nirvanix的平台。
Assumption: Application is web enabled/web based
I'm surprised no one has really mentioned this ... delegate it out to others who are specialists -> use a 3rd party image/file hosting provider.
Store your files on a paid online service like
Another StackOverflow threads talking about this here.
This thread explains why you should use a 3rd party hosting provider.
It's so worth it. They store it efficiently. No bandwith getting uploaded from your servers to client requests, etc.
如果你不是SQL Server 2008上,你有把特定的图像文件在数据库中的一些可靠的理由,那么你可以采取“两”的方针和使用文件系统作为一个临时缓存并使用数据库作为主存储库。
例如,你的业务逻辑可以检查,如果图像文件光盘上存在为它服务了,从数据库中检索必要时之前。 这给你买的多个Web服务器和较少的同步问题的能力。
我不知道有多少“真实世界”的例子,这是的,但我现在有出有一个应用程序,存储的集换卡游戏细节,包括对卡上的图像。 授予数据库中的记录数只有2851记录日期,但鉴于某些卡已被释放多次,并有备用的艺术品,它实际上是更有效的sizewise扫描“主广场”的作品动态,然后在请求时生成卡的边框和其他影响。
这个图像库的原创者创建呈现基于该请求的图像数据访问类,它确实是相当快的浏览和个人卡。
这也简化了部署/更新时,新卡的发布,而不是拉上了图像的整个文件夹和发送这些沿管路,并确保适当的文件夹结构创建的,我简单地更新数据库,并让用户重新下载。 目前这大小可达56MB,这是不是很大,但我正在为将来的版本增量更新功能。 此外,还有的是,允许那些通过拨号来获得无延迟下载的应用程序的一个“没有图像”的版本。
由于应用软件本身的目标是在桌面上的单个实例该解决方案很好工作至今。 有一个网站,所有数据存档的在线访问,但我决不会使用此相同的解决方案。 我同意文件访问将是可取的,因为它会变得更好的频率和影像正在发出的请求量。
但愿这不是太唠叨,但我看到的主题,希望提供从一个比较成功的小型/中型规模应用我的一些见解。
SQL Server 2008中提供了具有两全其美的解决方案: 将FILESTREAM数据类型 。
管理它像一个普通的表,并有文件系统的性能。
这取决于你要存储以及它们的大小图像的数量。 我已经使用数据库来存储在过去图像和我的经验已相当不错。
IMO,使用数据库来存储图像的优点,
答:您不需要FS结构来保存你的图片
B.数据库索引的性能比FS树木更好时,可以存储更多的项目的数量来
C.威风调整数据库缓存在查询结果执行好工作
D.备份很简单。 这也是行之有效的,如果你有复制设置和内容从服务器接近用户交付。 在这种情况下,并不需要显式同步。
如果您的图片将是小的(比如<64K)和你的数据库的存储引擎支持在线(在记录)的BLOB,它可以提高性能进一步,因为不需要间接(局部性的参考实现)。
存储图像可能是当你正在处理少量的巨大尺寸的图像是一个坏主意。 在数据库存储图像的另一个问题是,像元数据的创建,修改日期必须由应用程序处理。
我最近创建了一个PHP / MySQL的应用程序,它存储的PDF / Word文件在MySQL表(大如每个文件40MB至今)。
优点:
缺点:
我会打电话给我实施的成功,它需要照顾的备份需求,简化了项目的布局。 性能优良的谁使用应用程序的20-30人。
IM我的经验,我必须管理两种情况:存储在数据库和图像存储在数据库路径中的文件系统上的图像。
第一个解决方案,在数据库图像,是有点“更清洁”为您的数据访问层将只与数据库对象的处理; 但是这是件好事,只有当你需要处理低的数字。
当你处理二进制大对象显然数据库访问性能降级,数据库尺寸将会增大很多,这也会造成性能损失......,通常数据库空间要大于文件系统空间更加昂贵。
在具有存储在文件系统中大型二进制对象另一方面会使你有必须考虑数据库和文件系统备份计划,这对于一些系统的问题。
另一个原因去文件系统时,你必须分享您的图像数据(或声音,视频,等等)与第三方接入:在这天我正在开发,它使用必须从“外部访问图像的Web应用程序“以这样的方式,数据库访问来检索二进制数据我的Web场是根本不可能的。 所以有时也有设计考虑,将推动你选择。
想想也是,这个选择的时候,如果你要处理的许可和认证访问二进制对象时:这些先决条件通常可以在一个更简单的方法来解决,当数据存储在数据库中。
我曾经在一个图像处理应用。 我们存储在目录中上传的图片,这是类似/图片/ [今天的日期] / [ID号]。 但是,我们还从提取的图像中的元数据(EXIF数据),并存储在数据库中,与时间戳和这样沿。
在以前的项目中,我存储在文件系统中的图像,并引起了很多与备份,复制和文件系统不同步与数据库头痛。
在我最近的项目中,我将图像存储在数据库中,并缓存它们在文件系统中,它的作品真的很好。 到目前为止,我已经没有任何问题。
第二个文件路径的建议。 我一对夫妇的一个需要管理大型十岁上下的资源集合的项目工作,以及任何企图直接存储东西,在DB造成痛苦和无奈长远。
唯一真正的“亲”我能想到的关于将它们存储在数据库中是容易的个人形象资产的潜力。 如果没有使用任何文件路径,并且所有图像都流直出DB的,没有他们不应该访问用户查找文件的危险。
这似乎是将它与中介脚本从Web不可访问的文件存储中提取数据较好地解决,虽然。 因此,DB存储是不是真的有必要。
街道上的字是,除非你是一个数据库供应商试图证明你的数据库可以做到这一点(比如,假设微软吹嘘TerraServer获得存储在SQL Server中bajillion图像),这不是一个很好的主意。 当选择 - 存储在文件服务器上的图像和路径数据库是如此容易得多,何必呢? BLOB字段是一种像越野车的越野能力 - 大多数人不使用它们,那些谁通常遇到麻烦,然后还有那些谁,但只为它的乐趣做。
在数据库中存储的图像仍然意味着图像数据在文件系统中的某个地方结束了,但掩盖,让你不能直接访问它。
+新村:
-VEST:
这两种方法是常见的实践。 看看的优点和缺点。 无论哪种方式,你就必须思考如何克服的缺点。 在数据库中存储通常是指调整数据库参数和实施某种缓存。 使用文件系统需要你找到保存文件系统+数据库同步的某种方式。