Postgresql数据库的文件存储系统

时间:2018-07-16 14:31:15

标签: database postgresql database-design relational-database

我目前有一个数据库,该数据库需要存储很多文件。但是,我也存储有关特定文件的信息。我希望能够将文件与包含此元数据的数据库一起存储,我想知道如何最好地做到这一点。文件是自动生成的,并且具有适合文件系统的层次结构。

最初的想法是将路径存储到包含所有文件的文件系统的根目录中,然后引用与此相对的文件(例如../file_group_1/file_1)。在对此进行调查时,很难找到一种不用说就在与管理文件系统的数据库一起运行单独的服务器的情况下将文件存储在此文件系统中的方法。

我已经研究了Postgresql中的Large Objects类型,但是我也担心安全隐患。有更好的解决方案吗?

2 个答案:

答案 0 :(得分:1)

通常最好将文件存储在数据库外部,因为访问速度更快并且数据库大小较小。不利的一面是,面对崩溃,事务中止等情况,您的应用程序将不得不管理数据库和文件系统之间的一致性。

我将使用元数据存储文件的完整路径;拆分它并不会节省很多,而且会使查询更加复杂。

要保持数据库与文件系统之间的一致性,可以始终先写入文件,而从不删除文件,除非在特殊的垃圾收集运行期间,当您还可以识别和删除孤儿时。

如果文件存储在数据库中,则bytea优于大型对象,除非文件非常大或需要部分读写。

答案 1 :(得分:0)

用于制作最佳文件系统。我建议使用文件夹和文档层次结构。
文档表将引用实体表和parent_doc_id作为层次结构逻辑。您应该根据需要使用递归CTE获取文档树。
在文件系统中,可以将路径与文档引用一起使用。

实体=> 1001
文件1 => 1002
文档2 => 1003

我建议在文件系统中使用整数路径,以避免重复的文件名重叠。
适用于文档1:1001 \ 1002
适用于文档2:1001 \ 1003
您可以在表中存储的实际文件名和路径以供参考。