我应该将文件存储在数据库中还是只存储到该文件的位置?

时间:2010-11-25 02:45:53

标签: database file file-upload

存储文件的哪种方法更好?直接将文件存储在数据库中,还是只存储到该文件的位置?

4 个答案:

答案 0 :(得分:4)

避免将文件存储在数据库中。大多数人并没有很好地处理它们。

答案 1 :(得分:2)

如果接受答案的速度很快,您就无法从更多受众那里获得答案。

这取决于。你需要考虑几件事。

  1. 如果你有一个米老鼠免费软件数据库,这意味着它不能正确处理blob(读取每个SELECT上的blob;不要将blob存储在一个单独的区域中),请将文件保存在外面。

  2. 如果您有企业数据库,那么将blob保留在数据库中完全没有问题。这些不会读取每个SELECT上的blob。获得blob的额外读取不是“性能”“问题”。

  3. 大多数数据库是2k页而不是8k或16k。如果你的页面大小较大,那么每个blob的最后一页的未使用部分会有一些浪费。

  4. 将blob保留在数据库中的缺点是数据库备份会更大。某些企业数据库会注意到页面未更改,并将其从增量备份中排除;其他人没有增量。

  5. 将blob保留在数据库中的优点是数据和参照完整性。你不会遇到让行与blob不同步的问题。

    • 我去年完成了一项协议,其中,cust在数据库中有130GB的数据,并且在db之外存储了700GB的文件。经过十年的问题,他们咬紧牙关,将文件移入数据库。猜猜什么,应该是一个简单的工作(长而简单),因为引用应该是绝对正确的,最终是大规模的,因为有太多的重复和无效的引用。由此产生的数据库为630GB,有100GB的欺骗。 2K页面大小。
  6. 回复评论

    1. 斜线或反斜杠
      简单。在数据库中,仅存储斜杠。您需要一种识别目标系统的方法,以及IsWindoze指标。它应该在表层次结构中更高,而不是在您找到Filename的级别。如果设置了指标,则无论何时报告或显示Filename列,请将斜杠更改为反斜杠 您将遇到与DriveLetter和冒号相似的问题,而Unix没有。

答案 2 :(得分:1)

迟到的答案:这取决于你的发动机。

  • 自20世纪90年代以来,SQL Server一直没有使用2k的页面大小。 Oracle默认为8K,SQL Server为8K。只有Sybase AFAIK仍然在上个世纪。

  • SQL Server现在提供FILESTREAM,它结合了两全其美,因为Oracle使用BFILE做得更长

  • SQL Server和Oracle提供磁盘和备份压缩

我确信PostgresSQL至少提供了类似的功能。

注意:这主要是为了提供PerformanceDBA的FUD的替代品

答案 3 :(得分:0)

首选方法是将文件存储在文件系统中,并将文件的位置存储在数据库中。这样做的原因与数据库在磁盘上物理分配空间的方式有关(通常是8k或16k块)。删除大文件会导致数据库使用不同的机制来存储文件(SQL Server将其称为row overflow data)。通常,这些类型的页面位于普通表之外,因此每行的每次逻辑读取都会导致磁盘上的两次物理读取。不用说,这对性能不利。