Sql 何时使用外部文件或varbinary列?

Sql 何时使用外部文件或varbinary列?,sql,sql-server,asp.net-web-api,Sql,Sql Server,Asp.net Web Api,我需要在服务器上存储二进制数据-每项大约2K。我以前从未在sql server中使用过varbinary类型。我正在考虑两种选择: 将二进制数据存储在文件中,并将该文件的路径放入表中 纵队 将二进制数据作为varbinary存储在表中 我意识到在第一个选项中,数据库的负载是最小的。但是,需要考虑文件IO 与DB交互的应用程序是.NET RESTFull WebAPI(c#)。目标表中的行总数将为4-5000 在这种情况下,最佳做法是什么 使用varbinary并将其存储在数据库中更简单。简单

我需要在服务器上存储二进制数据-每项大约2K。我以前从未在sql server中使用过varbinary类型。我正在考虑两种选择:

  • 将二进制数据存储在文件中,并将该文件的路径放入表中 纵队
  • 将二进制数据作为varbinary存储在表中
我意识到在第一个选项中,数据库的负载是最小的。但是,需要考虑文件IO

与DB交互的应用程序是.NET RESTFull WebAPI(c#)。目标表中的行总数将为4-5000


在这种情况下,最佳做法是什么

使用varbinary并将其存储在数据库中更简单。简单的SQL语句将检索和存储数据。如果您的应用程序要求不高,行数很少(少于10万行),我会使用这种策略

现在,如果你真的对性能感兴趣,你可以花更多的编程精力。您可以将二进制数据作为文件存储在文件系统中,但随后会发现一些问题:

  • 保存/检索文件的额外逻辑
  • 使用唯一的名称命名文件
  • 目录限制了文件的数量
  • 应用程序可以在多个服务器中运行。这些文件需要可以从其中任何一个获得。也就是说,您需要一个网络文件系统
  • 交易不一致。如果保存数据库行,但文件未保存,会发生什么情况
  • 文件系统分配需要不断检查,以避免磁盘空间耗尽
  • 你说得对

当您想要优化时,使用文件是值得的,但在开发过程中,以及在支持和维护过程中,需要做更多的工作。

使用varbinary并将其存储在数据库中更简单。简单的SQL语句将检索和存储数据。如果您的应用程序要求不高,行数很少(少于10万行),我会使用这种策略

现在,如果你真的对性能感兴趣,你可以花更多的编程精力。您可以将二进制数据作为文件存储在文件系统中,但随后会发现一些问题:

  • 保存/检索文件的额外逻辑
  • 使用唯一的名称命名文件
  • 目录限制了文件的数量
  • 应用程序可以在多个服务器中运行。这些文件需要可以从其中任何一个获得。也就是说,您需要一个网络文件系统
  • 交易不一致。如果保存数据库行,但文件未保存,会发生什么情况
  • 需要经常检查文件系统分配,以避免磁盘空间不足
  • 你说得对

当您想要优化时,使用文件是值得的,但在开发过程中,以及在支持和维护过程中,都需要做大量的工作。

这里没有正确或错误的答案。你可能还想看看文件存储。我同意肖恩的观点,但是。在每项2k和4-5k的情况下,我们谈论的是10MB的数据。这真的不算什么。做任何对你的应用程序来说更简单的事情,并更多地考虑更重要的因素。将文件名存储到实际文件中的问题是确保文件实际存在。打开文件和检索其内容也会带来开销,这里没有正确或错误的答案。你可能还想看看文件存储。我同意肖恩的观点,但是。在每项2k和4-5k的情况下,我们谈论的是10MB的数据。这真的不算什么。做任何对你的应用程序来说更简单的事情,并更多地考虑更重要的因素。将文件名存储到实际文件中的问题是确保文件实际存在。打开文件和检索其内容也会带来开销,我认为将这些存储在数据库中并不总是简单的。例如,如果最终的结果是在网页上创建图像,那么存储文件路径和发送源位置的工作量通常会减少。如果给每个文件一个identity属性和一个guid作为名称,这并不重要。这就是为什么我说这里没有正确或错误的答案。有很多观点和情况需要给出一个明确的答案。绝对不是说你的不正确,只是指出了另一面+1我认为将这些存储在数据库中并不总是更简单。例如,如果最终的结果是在网页上创建图像,那么存储文件路径和发送源位置的工作量通常会减少。如果给每个文件一个identity属性和一个guid作为名称,这并不重要。这就是为什么我说这里没有正确或错误的答案。有很多观点和情况需要给出一个明确的答案。绝对不是说你的不正确,只是指出了另一面+1.