数据库:图像文件为blob还是文件路径?

时间:2013-06-04 18:01:00

标签: database data-structures

我知道这个问题一直被问过。

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

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

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

3 个答案:

答案 0 :(得分:7)

在我看来,你应该存储路径而不是blob。但它又取决于许多其他事情 - 你有自己的服务器吗?或者你在其他地方托管它?将这些内容放入数据库中这些事情真的很重要吗?什么是你的备份策略等..

我有自己的推理

  • 文件系统用于管理文件,在您的情况下,歌曲和图像不是很关键。并且假设如果您的数据库大小增加,性能将下降。如果对象平均大于1兆字节,则NTFS具有明显优于SQL Server
  • 的优势

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

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

简而言之,我可以看到使用文件系统存储歌曲和图片的许多优点。

答案 1 :(得分:1)

这实际上取决于你在做什么。

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

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

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

答案 2 :(得分:1)

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

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

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

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

  • 将BLOB数据同步与行中的其余项目保持一致更容易。
  • BLOB数据与数据库备份。拥有单一存储系统可以简化管理。
  • 可以通过SQL Server 2005中的 XML支持访问BLOB数据,SQL Server 2005可以返回XML流中数据的基本64位编码表示。
  • 可以对包含固定或可变长度字符(包括Unicode)数据的列执行SQL Server全文搜索(FTS)操作。您还可以对图像字段中包含的格式化基于文本的数据执行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数据导致繁重的数据库(当您在数据库中存储许多文件时),那么数据库备份过程可能需要更长的时间才能完成并为您带来麻烦。