答案 0 :(得分:37)
我在一个大型软件系统上工作,该系统已经完成了存储附件和其他内容的两种机制。系统的第一次迭代将所有数据存储在DB中的BLOB中。我当时诅咒它。作为程序员,我可以编写辅助脚本来立即对数据进行操作,并在需要时随时更改。
提前大约10年,我仍然管理相同的软件,但架构已经改变,它是用文件系统指针编写的。我现在诅咒它并希望它回到数据库中。我有几年的额外好处,并且已经在更多更大的情况下以更大的容量使用这个应用程序,我觉得我的观点现在受到更好的教育。应用程序的升级或系统迁移需要大量脚本和数百万个文件的复制。有一次,我们更改了操作系统,所有文件指针都有错误的目录分隔符,或者服务器名称在文件所在位置发生变化,我们不得不在周末编写和安排简单的SQL更新语句与DBA进行修复。另一个是文件系统和数据库记录不同步,为什么不确定,但经过数千天的操作,有时非事务性系统(文件系统和数据库不共享事务上下文)只是变得不同步。有时文件会神秘地丢失。
当所有这些都在数据库中时,迁移或环境升级是转储和导入数据库的问题。可以正确审核行更改,同步和日志中的所有内容都可以在必要时重播到时间点。当然数据库变大了,但它是2011年,这对于数据库来说根本不是一个挑战。
对于什么是值得我们在流式传输某些数据时遇到大型数据缓冲区的类似问题,但是A)我们可以使用JDBC和B中的Input | OutputStreams在字节缓冲区中抽取数据时使用其他工具,我们写了一个存储过程,它将BLOB块化为临时表,并迭代地从临时表中提供块。效果很好。
我不在乎不将这些东西放在数据库中的技术原因,但是更容易在合并的位置管理我可以加倍在很短的时间内管理不同的文件,顾问和客户浪费了数据库的硬件或网格三倍。
更新:对评论者很容易,他们只是就此事发表意见。