【发布时间】:2010-11-25 02:45:52
【问题描述】:
存储文件的更好做法是什么?直接将文件存储在数据库中还是只存储该文件的位置?
【问题讨论】:
-
我很惊讶 - 这个问题仍在公开讨论/辩论中?而且它不是任何重复的,嗯...
标签: database file file-upload
存储文件的更好做法是什么?直接将文件存储在数据库中还是只存储该文件的位置?
【问题讨论】:
标签: database file file-upload
避免在数据库中存储文件。大多数人都不能很好地处理它们。
【讨论】:
这取决于。您需要考虑几件事情。
如果您有一个米老鼠免费软件数据库,这意味着它不能正确处理 blob(读取每个 SELECT 上的 blob;不会将 blob 存储在行的单独物理结构中; blob 非常慢;等等)
如果您有企业 SQL 平台,将 blob 保留在数据库中完全没有问题。事实上,检索更快。这些不会读取每个 SELECT 上的 blob,它们存储在与行不同的物理结构中。如果SELECT 请求获取 blob,则额外读取一次,这不是“性能问题”。
正版SQL数据库中的PAGESIZE可以设置为2k; 4k; 8k;或 16k。
将 blob 保留在数据库中的缺点是,您的数据库备份会大大增加。
将 blob 保存在数据库中的优点是:
数据和参照完整性。您不会遇到与 blob 不同步的行的问题
blob 包含在备份中:否则,在恢复时,将恢复的数据库与恢复的文件同步的任务是一个主要问题。
我去年完成了一项任务,客户在数据库中有 130GB 的数据,在数据库之外存储了 700GB 的文档。经过十年的问题,他们咬紧牙关,将文档移入数据库。
猜猜看,本应是一项简单的工作(冗长但简单,因为引用应该是绝对正确的),最终变得庞大,因为有很多 (a) 重复和 (b) 无效引用。
生成的数据库为 630GB,其中有 100GB 的欺骗。 2K 页面大小。
斜线或反斜线
很简单。
IsWindoze 指示符。它应该在表层次结构中较高,而不是在 Filename 所在的级别。Filename 列时,如果是IsWindoze,请将斜杠更改为反斜杠。DriveLetter 和冒号D: 会有类似的问题,而 Unix 则没有。仅当 IsWindoze 时才允许。
【讨论】:
迟到的答案:这取决于您的引擎。
自 1990 年代以来,SQL Server 没有使用 2k 的页面大小。 Oracle 默认为 8K,SQL Server 为 8K。只有 Sybase AFAIK 还停留在上个世纪。
SQL Server 现在提供 FILESTREAM,它结合了两全其美,正如 Oracle 长期以来使用 BFILE 所做的那样
SQL Server 和 Oracle 提供磁盘和备份压缩
我确信 PostgresSQL 至少提供了类似的功能。
注意:这主要是为了提供 PerformanceDBA 的 FUD 的替代方案
【讨论】:
RecordIds;广泛的记录;和行级锁定,没有OLTP的概念。 2) SAP/Sybase 拥有华尔街 95% 的市场(提示:高端 OLTP)。 Wall St 仍然使用 2GB 磁盘。 3) PostGres 是反 SQL 的。 4) 替代品 ? Q 与压缩无关。
首选方法是将文件存储在文件系统中,并将文件的位置存储在数据库中。其原因与数据库如何在磁盘上物理分配空间(通常为 8k 或 16k 块)有关。将大文件放在那里会导致您的数据库使用不同的机制来存储文件(SQL Server 称之为row overflow data)。通常,这类页面位于普通表之外,因此对一行的每次逻辑读取都会导致磁盘上的两次物理读取。不用说,这对性能不利。
【讨论】: