我知道这个问题一直被问过。
我读了this整个帖子,但仍然无法达到目的。
我正在制作一个允许用户下载壁纸和歌曲的网站。除了我,没有人会上传那些壁纸/歌曲。我的意思是说用户不会上传它们。现在。每个文件平均为6Mb(对于歌曲)。
现在,你想在这里做什么?将它们存储为blob文件还是使用文件路径?
答案 0 :(得分:7)
在我看来,你应该存储路径而不是blob。但它又取决于许多其他事情 - 你有自己的服务器吗?或者你在其他地方托管它?将这些内容放入数据库中这些事情真的很重要吗?什么是你的备份策略等..
我有自己的推理
另外请记住,当您必须备份数据库时,在某个阶段可能会非常头疼。另一方面,如果您的歌曲文件在磁盘上,那么它将很容易。
此外,如果您只在数据库中存储路径,则可以考虑将您的歌曲和图片保存在其他服务器(或多个服务器)上。
简而言之,我可以看到使用文件系统存储歌曲和图片的许多优点。
答案 1 :(得分:1)
这实际上取决于你在做什么。
如果您使用文件路径,则必须在该路径上设置不同且一致的安全性。你还需要做一些事情来强制执行唯一的文件名等,你还需要为该目录设置备份
如果你使用blob,数据库会为你处理安全性,备份应该与db中的其他所有内容保持一致。
您可以将它们作为blob存储在不同的表中,使用从第一个表到blob表的FK。那么你可以避免多次存储相同的blob等。
答案 2 :(得分:1)
我在KBrocksi_SEC forum.asp.net找到了另一个好的答案,所以我与你分享:
处理BLOB数据的常用替代方法是将BLOB数据存储在文件系统中,并在数据库列中存储指针(最好是统一资源定位符[URL]链接)以引用相应的文件。
在数据库中存储BLOB数据的优点
将BLOB数据存储在数据库中具有许多优点:
在数据库中存储BLOB数据的缺点
仔细考虑哪些资源可以更好地存储在文件系统而不是数据库中。很好的例子是通常通过HTTP HREF引用的图像。这是因为:
以下代码显示如何使用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数据的缺点