0

在我的项目中,我有一个有点大的数据库,大约有 60 个表。我应该保存和收集许多图像文件(大约 5000 个),它们的平均大小约为 2MB。

我的数据库的估计大小将是 10 GB 甚至更高!

首先在代码中考虑这些模型:

class Document
{
   [Key]
   public int Id {get;set}
// ...
   public virtual ICollection<ImageDocument> Images {get;set;}
}

class ImageDocument
{
   [Key]
   public int Id {get;set}
// ...
   public Document Document {get;set;}
}

如您所见,每个 Document 都有一些ImageDocuments.

我的解决方案:

考虑以下两步:

  1. 添加ImageDocuments到相关文档,然后通过调用AddSaveChange方法添加生成的文档EntityFramework DbContext

  2. ImageDocuments为每个相关文档调用创建的存储过程。调用的存储过程使用 bcp 命令从数据库中提取图像文件并将其保存在服务器的特定路径中,然后ImageDocument从数据库中删除该数据。

它有效,但我在这种方式下遇到了一些问题:

  1. 我无法创建备份集成文件。
  2. 由于我的保存交易导致的原子性违规被破坏为一些小交易。
  3. 一致性违规。可能在调用存储过程时系统陷入崩溃。
  4. 耐久性违规。因为删除ImageDocument记录释放数据库空间。

现在我的问题是,有没有更好的解决方案来做到这一点并解决问题?

如果我们可以在 SQL Server 中创建一个文件字段来维护文件分隔的数据库文件中的内容,那就太好了。

4

1 回答 1

2

如果您使用的是 SQL Server,则应该使用 FileStreams。通过 SQL 代理直接到磁盘。

http://msdn.microsoft.com/en-us/library/gg471497.aspx

于 2013-06-24T13:35:00.557 回答