0

对于最近的 MVC3 项目,我最终将文件存储在 MSSQL 数据库中byte[](MVC3 将其转换为 varbinary(max) 列)。

一旦文件被提交到数据库,它们就永远不会改变。

现在我试图变得非常聪明,即使用户一遍又一遍地添加同一个文件,也要避免多次存储同一个文件。

我避免这种情况的第一个想法是创建一个 where 查询来尝试查找是否存在与byte[]我尝试添加的匹配项。然而,我担心这是一个过于繁重的查询,因为文件的大小可能在 100Mb 左右,并且可能有多个人同时添加它们。

为了更聪明,我可以使用有关文件的一些信息来缩小搜索范围。我目前在模型中有以下相关列。

public byte[] FileData { get; set; }        
public String MimeType { get; set; }
public double FileSizeMb { get; set; }

我可以搜索是否有任何文件具有相同的 mime 类型和文件大小,还可以添加一个哈希值,byte[]看看我是否可以在尝试匹配byte[]. 这样我只比较当我有一个正确大小的正确类型和相同哈希的文件时,它应该不那么重..

有没有更好的选择来实现这一点?我将如何最好地解决这个问题?

如果有什么不同,我使用的是 mssql 2012。

4

2 回答 2

1

我认为以字节为单位存储原始长度和由 c# 计算的哈希应该就足够了。

于 2012-07-31T19:39:06.030 回答
1

您应该计算您的哈希值FileData(当然是在 Web 服务器端),并使用哈希值和文件大小进行搜索。如果您有匹配项,您应该下载FileData到 Web 服务器并进行比较(而不是相反)。

于 2012-07-31T19:40:45.400 回答