【问题标题】:storing ext3 in a sql database将 ext3 存储在 sql 数据库中
【发布时间】:2019-04-20 04:48:14
【问题描述】:

是否可以在 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

这看起来是不是有点离谱,或者这可能吗?有什么更好、更规范的存储方式?

【问题讨论】:

  • 您是要存储/管理目录列表的结果,还是要问是否可以用 sql 数据库替换 ext3?
  • @Solarflare 我的意思是目录元数据——文件所在的位置以及它们拥有的权限。
  • 抱歉,我仍然不确定您在寻找什么。您是否希望我们将我们认为应该是文件系统元数据一部分的所有信息添加到您的 erd 中,或者您是否在询问您当前选择的数据是否已标准化?我会挣扎,例如使用“链接”,因为如果您使用目录列表存储/检索这些链接,则应该/可以计算(如果您想这样做则不清楚);您也可能需要一些层次结构模型来为您的目录,参见例如here.

标签: mysql sql database-design ext3


【解决方案1】:

当然,您可以抓取文件系统并收集有关每个文件和目录的元信息,然后将其存储到数据库中。但该信息不能替代文件系统的信息,只能是它的“副本”。

我会(至少)有 2 张桌子:FilesDirectories。一个文件会有一个 dir_id。一个目录将同时拥有一个 dir_id 和一个 parent_id 用于遍历目录树。树的顶部(“根”)将为零或空值。

软链接、硬链接、设备、挂载、/proc 等会增加挑战,但也许你不关心它们?

size 必须是 BIGINTpermissions,如果编码,可能适合SMALLINT UNSIGNED,或者可以存储为字符串。 usergroup 可以是 id 或字符串;您可能需要一个 id:name 用户表和一个组表。对于date,考虑TIMESTAMPDATETIME;请记住,操作系统可能正在做一些更接近TIMESTAMP 的事情来处理时区。 (Windows 可能不同。)

如果您要存储文件的副本,那么我建议使用另一个表,通过file_id 链接到Files。但是请注意,LONGBLOB 被限制为 4GB,并且还有其他设置使存储大于 16MB 的内容变得困难。因此,我可能会建议对大于 64KB 的任何内容进行分块、压缩块等。(这可能需要另一个表。)

至于我上面建议的从“层次结构”重构完整路径,只是少量的代码。它可以在您的应用程序代码或存储过程中完成。在 MySQL 8.0 或 MariaDB 10.2 中,可以使用“CTE”来帮助向下钻取树。

(是的,我在过去的几个项目中做过大部分这些事情。)

【讨论】:

  • 感谢您的回复,非常有帮助。出于好奇,您为什么需要将FilesDirectories 分开到两个表中?例如,您不能将它存储在一个表中,如Entity 或类似的东西吗?
  • @DavidL - 你说得有道理。这取决于您需要什么信息。在我的项目中,我需要足够的差异来保证两张表。对于单个表,您可能需要一个标志来表示目录与文件。
猜你喜欢
  • 1970-01-01
  • 2011-08-12
  • 2017-12-04
  • 2017-04-10
  • 1970-01-01
  • 2014-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多