2011-11-30 80 views
2

继承人的应用用本地数据库在WPF中存储/处理文件附件的最佳方式是什么?

基本的背景知识..

  1. 多个用户(通常只有一个),每台机器
  2. 本地SQL Server数据库运行在每台机器上持有自己的数据
  3. WPF应用程序有能力将表中的数据导出到zip文件

因为它现在坐着,所以我无法改变它的环境。

我看到两个选项与保存/上传附件处理到文档(PDF,DOC) 目前暂无大小要求或需要扩展我的知识

  1. 保存每个文件作为VARBINARY直接进入该数据库,并使用FK的和参考表来获得这些文件附件回到开

  2. 具有相同FK的和参考表的应用程序,但我保存到文件到某个文件夹上的本地硬盘(哈希值+加密? )。然后,我将该文件重命名为通用名称,并将该文件的名称和位置存储在数据库中。

第一选择似乎做作,当我在web开发中涉及这一点,但因为我有一个应用程序服务器,我没有担心可能的用户的干扰。

我喜欢的方案二,但这些文件可以由用户移动,抛开一切不正常的,可能留下了数据库或孤立的文件孤立子记录的选项。

对此有最佳做法吗?

回答

1

如果使用支持的SQL Server版本,最好的办法是使用FILESTREAM data type,因为它提供了很多性能优势,以使其值得,除非所有存储的对象都小于1MB。

从文章:

如果满足以下条件,你应该考虑使用 FILESTREAM:正在存储

对象是,平均大于1 MB。

快速读取访问非常重要。

您正在开发应用程序,该应用程序使用中间层用于应用程序 逻辑。

对于较小的对象,在数据库 中存储varbinary(max)BLOB通常会提供更好的流式传输性能。

希望有所帮助!

+0

看着它,它看起来正是我想要的。让sql server处理指针引用并消除超越varbinary max的可能性。随同将它保存在文件系统而不是数据库文件。 – Tim

0

这完全取决于您的要求。

如果你希望能够到SQL数据库从一台机器复制到另一个,或者如果你想通过还原数据库备份到具有完整的灾难恢复,那么选项1是你最好的选择。当然这意味着你的数据库可以增长得相当大。

如果你要保持你的数据库较小,可以确保您的目录或文件系统的保护,就不需要上述要求,那么选项2是一个不错的选择。

我不知道你的要求,但对于我过去的选项1项目一直是最好的。

0

这是性能VS一致性的问题。我从本地SQL Server数据库的二进制列提供了1 GB的图像集合(每个大约100 KB),并且工作顺利。我们甚至允许将数据库作为远程服务器安装到多个用户,并仍然正常工作(尽管我们不支持大量的并发用户)。

我们曾经有一个Access数据库,其中包含磁盘上的文件,但用户经常会搞乱文件结构并丢失文件等。将它们存储在数据库中已经证明非常可靠并且性能不是很差。备份,权限管理和导入/导出非常简单。

我会推荐选项1,除非您有其他需要的性能要求。

相关问题