mysql—在sql数据库中存储ext3

5lhxktic  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(402)

有可能在mysql中存储一个类似ext3的系统吗?例如,构建包含路径和权限的文件元数据系统?如果是的话,它的示例格式是什么?我想开始的非规范化路线应该在这里:

-rw-r--r--@  1 david  staff   552B Nov  2 15:55 wsgi.py
-rw-r--r--   1 david  staff   113B Oct 30 20:45 ~.bash_profile

所以我们有7列:

permissions | links | user | group | size | date | filename

我想我们还需要另外两个“管理层”:

fileId | directoryId

这看起来有点不对劲,还是有可能?有什么更好、更规范的存储方式呢?

mi7gmzs6

mi7gmzs61#

当然,您可以对文件系统进行爬网,收集每个文件和目录的元信息,然后将其存储到数据库中。但是这个信息不能代替文件系统的信息,只能是它的“副本”。
我会有(至少)两张table: Files 以及 Directories . 一个文件将有一个dir\u id。一个目录将有一个dir\u id作为它自己,还有一个父目录id作为在目录树上遍历的对象。树的顶部(“根”)将为零或空。
软链接、硬链接、设备、挂载、/proc等等,都会增加挑战,但也许你不在乎它们? size 需要成为一个 BIGINT . permissions ,如果编码的话,可能适合 SMALLINT UNSIGNED ,或者可以存储为字符串。 user 以及 group 可以是id或字符串;您可能需要一个id:name表用于用户,一个用于组。为了 date ,考虑 TIMESTAMP 或者也许 DATETIME ; 请记住,操作系统可能正在做一些更接近 TIMESTAMP 处理时区(windows可能不同。)
如果您正在存储文件的副本,那么我建议使用另一个表,链接到 Files 通过 file_id . 但是,小心,一个 LONGBLOB 仅限于4gb,而且还有其他设置使存储大于16mb的数据变得困难。因此,我建议对大于64kb的数据块进行分块,压缩这些数据块,等等(这可能需要另一个表)
至于从我上面建议的“层次结构”重建完整路径,这只是少量代码。它可以在应用程序代码中完成,也可以在存储过程中完成。在mysql 8.0或mariadb 10.2中,可以使用“ctes”来帮助钻取树。
(是的,在过去的几个项目中,我已经完成了其中的大部分工作。)

相关问题