【问题标题】:Database: image file as blob or file path?数据库:图像文件作为 blob 或文件路径?
【发布时间】:2013-05-31 05:49:13
【问题描述】:

我知道这个问题已经被问过很多次了。

我阅读了this 的整篇帖子,但仍然无法达到目的。

我正在制作一个允许用户下载壁纸和歌曲的网站。除了我,没有人会上传这些壁纸/歌曲。我的意思是说用户不会上传它们。目前。每个文件平均为 6Mb(歌曲)。

现在,您想在这里做什么?将它们存储为 blob 文件还是使用文件路径?

【问题讨论】:

  • @Scotch 你这样做的原因是什么?因为我的文件太大了?
  • 老实说,我只是这么说,因为这是我喜欢做的事情,而且占用的空间更少。作为前端应用程序的开发人员,我更愿意拥有文件的路径而不是对象。
  • 就我个人而言,我不会做 db,只是因为根据我使用巨大 db 进行备份和恢复的经验,当您将文件存储为 base64 字符串并且增加 1/3 或存储的东西大小,它很复杂。
  • @PatrickEvans 我对所有这些数据库的东西都很陌生。我会按照你说的去做。那么,您确定我应该选择文件路径而不是 BLOB 吗?
  • 肯定是这样,否则这意味着编写更多的代码来让文件进出数据库。您可以将文件的路径存储在数据库中,这样您仍然可以查询数据库,例如此页面上的文件以及该页面上的文件等,然后只需在代码中相应地使用路径。跨度>

标签: database data-structures


【解决方案1】:

在我看来,您应该存储路径而不是 blob。但这又取决于许多其他事情 - 你有自己的服务器吗?还是您将其托管在其他地方?这些东西作为 blob 放入 DB 真的很重要吗?你的备份策略是什么等等。

我有自己的理由

  • 文件系统用于管理文件,在您的情况下,歌曲和图像不是很重要。想象一下,如果您的数据库规模扩大,性能将会下降。如果对象平均大于 1 MB,则 NTFS 比 SQL Server 具有明显优势

另外请记住,当您必须备份数据库时,在某些阶段可能会很头疼。另一方面,如果您的歌曲文件在磁盘上,那么它会很容易。

此外,如果您只是将路径存储在数据库中,您可以考虑将您的歌曲和图片也保存在其他服务器(或多个服务器)上。

总之,我看到了使用文件系统存储歌曲和图片的很多好处。

【讨论】:

  • 不,我将拥有自己的服务器。而且我不太确定备份策略..你能给我参考一些书/博客来给我所有这些信息吗?
  • 当然,作为第一步,您可以参考microsoft 网站。如果您需要其他帮助,请告诉我
  • 非常感谢......我会在阅读完这些内容后明天回来。这是我第一次发布网站。设计部分很容易 n 已经完成。在数据库部分苦苦挣扎。
【解决方案2】:

这真的取决于你在做什么。

如果您使用文件路径,那么您必须在该路径上进行不同且一致的安全设置。您还必须做一些事情来强制执行唯一的文件名等。您还需要为该目录​​设置备份

如果您使用 blob,数据库会为您处理安全问题,备份应与数据库中的其他所有内容保持一致。

您可以将它们作为 blob 存储在不同的表中,并使用从第一个表到 blob 表的 FK。那么您可以避免多次存储同一个 blob,等等。

【讨论】:

  • @JohnGardener 所以无论文件有多大,您都更愿意使用 BLOB?
  • 就像我说的那样,这完全取决于:) 如果这只是为了你自己,并且你是唯一的用户,那么将它作为路径 + 文件夹可能会更简单。你想锁定路径吗?如果它只是一个文件路径,您可以假设它对 Web 服务可见,人们可以直接下载文件。这将简化那部分。
  • 不,我不明白你在说什么。我对数据库的东西很陌生。能否请您参考一些书/博客,让我可以从头到脚阅读所有这些内容?
  • 这是一项艰巨的任务,您可以在一个地方从头到脚阅读所有这些内容。没有一个地方可以满足您的特定需求,或者解决方案已经存在,您不必自己编写。有一个完整的dba.stackexchange.com 涵盖数据库问题等。根据您使用的数据库类型,有无数的书籍+博客。
  • @JohnGardner 这个问题的问题在于,想要一个便宜又快速的解决方案的人总是找到一种方法来证明在所有场景中使用文件路径是合理的。然而,当面对限制直接文件访问的问题(以及人们共享 URL 的问题)时,他们没有好的答案。奇怪的是,对这个问题没有答案,将这些类型循环回不惜一切代价促进文件路径的存储。他们说数据库方法太复杂了。虽然确实需要更多的规划和编码,但对于高价值内容来说,这可能是正确的决定。
【解决方案3】:

我在forum.asp.net 中找到了KBrocksi_SEC 的另一个好答案,所以我与你分享:

处理 BLOB 数据的常用替代方法是将 BLOB 数据存储在文件系统中,并在数据库列中存储指针(最好是统一资源定位符 [URL] 链接)以引用适当的文件。

在数据库中存储 BLOB 数据的优势

在数据库中存储 BLOB 数据具有许多优势:

  • 使 BLOB 数据与行中的其余项目保持同步更容易。
  • BLOB 数据与数据库备份。拥有一个单一的存储系统可以简化管理。
  • 可以通过 SQL Server 2005 中的 XML 支持 访问 BLOB 数据,它可以返回 XML 流中数据的 base 64 编码表示。
  • SQL Server 全文搜索 (FTS) 操作可以针对包含固定或可变长度字符(包括 Unicode)数据的列执行。您还可以对 图像 字段中包含的基于文本的格式化数据执行 FTS 操作,例如 Microsoft Word 或 Microsoft Excel 文档。

在数据库中存储 BLOB 数据的缺点

仔细考虑哪些资源可能更好地存储在文件系统而不是数据库中。很好的例子是通常通过 HTTP HREF 引用的图像。这是因为:

  • 与使用文件系统相比,从数据库中检索图像会产生大量开销。
  • 数据库 SAN 上的磁盘存储通常比 Web 服务器场中使用的磁盘上的存储更昂贵。

以下代码展示了如何使用 ADO.NET 将从文件中获取的二进制数据写入 SQL Server 中的 image 字段。

public void StorePicture( string filename )
{
  // Read the file into a byte array
  using(FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read))
  {
    byte[] imageData = new Byte[fs.Length];
    fs.Read( imageData, 0, (int)fs.Length );
  }


  using( SqlConnection conn = new SqlConnection(connectionString) )
  {
    SqlCommand cmd = new SqlCommand("StorePicture", conn);
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.Add("@filename", filename );
    cmd.Parameters["@filename"].Direction = ParameterDirection.Input;
    cmd.Parameters.Add("@blobdata", SqlDbType.Image);
    cmd.Parameters["@blobdata"].Direction = ParameterDirection.Input;
    // Store the byte array within the image field
    cmd.Parameters["@blobdata"].Value = imageData;
    conn.Open();
    cmd.ExecuteNonQuery();
  }
}

我也可以自己在上述解释中添加其他注释:

在数据库中存储 BLOB 数据的缺点

  • 如果您的 BLOB 数据导致大量数据库(当您在数据库中存储许多文件时),那么数据库备份过程可能需要更多时间才能完成并让您头疼。

【讨论】:

  • ....如果数据库在高可用性集群中,您的备份问题仍然重要吗?
  • @AnthonyRutledge,SQL Server 集群并没有帮助我们比没有集群的数据库更轻松地备份重型数据库。它帮助我们使数据库在失败事件时更加在线。另一方面,使用较轻的文件总是比备份和恢复大文件更容易和更好。
猜你喜欢
  • 2019-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-05
  • 2012-01-18
  • 1970-01-01
  • 2019-01-05
相关资源
最近更新 更多