Bas*_*tch -1
我需要在数据库中存储大量文件(几百万)
这意味着什么?您在数据库中到底存储了什么(那么什么是文件)?在什么操作系统上?对于什么文件系统?
(我隐含地想到了一些 Linux 或类 Unix 操作系统,因为它们对于互联网和 Web 服务器来说非常常见;记住,unix 文件实际上是i 节点,目录将名称与 i 节点相关联,一个文件可以有多个文件路径)
文件路径,它们只是带有一些限制的字符串(长度合理,通常最多几千字节);顺便说一句,您可以在将路径存储在数据库之前“规范化”路径(例如使用realpath(3) )。
文件内容,它们只是“ blob ”,即可能很大但任意的字节序列。在这里,您遇到了将各种大小的 blob 放入 DB 中的问题;一个文件可以包含 GB 甚至 TB 的内容,而 Blob 通常没有。大多数数据库系统都会完整处理 blob(例如将其保存在 RAM 中)。您能否承受文件大小的限制(例如几兆字节)?
文件元数据(例如,mtime、权限、所有权)通常也很小(例如,它可能由某些 SQL 表中的几个短列表示)
那么它们的文件是什么意思呢?也许您想要编写一些使用数据库进行存储并向操作系统提供文件系统抽象的应用程序。然后考虑用户空间的文件系统(FUSE)
顺便说一句,文件独立于数据库而存在(因为文件是操作系统提供的抽象)。它可能并且经常由某些外部程序创建、读取、写入或删除。在 Linux 上,考虑使用inotify(7)工具来通知文件系统事件(对于本地普通文件系统,例如 ext4)。
请注意,如今大多数数据库(以及 PostGreSQL 或 MySQL 等 RDBMS 和 MongoDB 等非 SQL DBMS)都将数据存储在文件中(也就是说,使用原始磁盘分区来存储数据库已经过时了)。
由于许多 DBMS 对内容设置了一些限制(例如,在某些 RDBMS 的某个表中的一行中,一个 blob 可能被限制为几十 KB),因此通常会采取与您的(不清楚的)问题建议相反的做法。一个典型的例子是将图像保存在数据库中。通常,您会隔离小图像(例如小于 8Kbytes)并将它们直接作为 blob 存储在某个表中(请记住,几个字节的小文件在大多数文件系统中都会产生很大的开销,例如在我的 ext4 计算机上,文件消耗至少 1 KB 的磁盘空间)和更大的图像:然后您将它们存储在文件系统中(某些文件路径,如0123/4567/89ab.jpeg)并将其文件路径存储在某个列中。YMMV。
| 归档时间: |
|
| 查看次数: |
4090 次 |
| 最近记录: |