【问题标题】:MySQL : Storing directory structure and query itMySQL:存储目录结构并查询它
【发布时间】:2018-02-13 10:03:30
【问题描述】:

我需要能够在 MySQL 中存储文件、目录,但我不知道该怎么做,所以我也可以有一个相当有效的查询来从表中获取数据,例如 /swatcat/supersccret.txt

我最初的想法是:

DROP TABLE IF EXISTS objects;
CREATE TABLE objects
(
    ID INT NOT NULL AUTO_INCREMENT, 
    filename VARCHAR(200) NOT NULL,
    objectTypeID INT NOT NULL,
    parentID INT,

    PRIMARY KEY (ID),
    FOREIGN KEY (objectTypeID) REFERENCES objectTypes(ID)
);

对象类型是文件或目录:

CREATE TABLE objectTypes
(
    ID INT NOT NULL AUTO_INCREMENT, 
    name VARCHAR(200) NOT NULL UNIQUE,

    PRIMARY KEY (ID)
);

我的想法是 parentID 将是文件或目录所在的目录......但问题是找到 /swatcat/supersecret.txt 以及如果我决定将 swatcat 重命名为 test101 那么我该如何创建查询能应付吗?

【问题讨论】:

  • 感谢您对objectTypeId 的澄清。我很难理解为什么以分层方式存储它比将filepathfilename 存储在单个记录中更有利。我喜欢在适用时使用父/子关系来存储数据,但对于这个用例来说似乎有点过分了。递归 CTE 可能很昂贵,您可能需要两次通过才能生成 UPDATE 语句。一次生成文件路径并找到您所追求的项目的id,第二次将更新应用于该id
  • @JNevill 我也是这么想的,但是如果目录改变了,更新会不会很复杂?
  • 你可以直接用替换:UPDATE myTable SET filepath = replace(filepath, '/originaldirname/','/newdirname/');Kind of like this。不同之处在于,这将影响更多记录,而您建议的架构将影响 1。尽管如果有多个同名目录(在不同的路径中),它会变得很难看。使用filepath|filename 模式很容易找到正确的路径,但使用父/子更复杂(虽然不可怕,只是更复杂)。
  • 嗨。由“思考过程”引起的疑惑/游荡对“问题”来说太笼统了。请阅读How to Ask 并采取行动。这包括总结适当的研究。您的问题应该结束;但这现在必须等到奖金结束。此外,SQL 中的分层数据in generalre file systems 都是常见问题解答。此外,没有特定设计、背景和成本效益功能,任何人都无法权衡设计选项:
  • 我目前的通用评论是“最佳”等:除非您定义它,否则工程中没有“更好”/“最佳”之类的东西。同样不幸的是,所有合理的实际定义都需要大量的经验,以及与对细节的混乱敏感度相互作用的大量因素。进行简单的设计。当您通过测量证明您可以想到的设计和所有替代方案都存在问题时(无论当时意味着什么),然后提出一个非常具体的问题。这也应该定义“更好”/“最好”。

标签: mysql tree


【解决方案1】:

计划 A:将目录路径与文件名放在单独的表中。

计划 B:与计划 A 类似,但路径是新表中“分层”排列的多行。

方案 C:保持“dir/fn”不变,然后使用 LIKERLIKE 定位行,然后使用 SUBSTRING_INDEX(或 MariaDB 中的 REGEXP_REPLACE)进行替换。

【讨论】:

  • 谢谢 JNevill 和 Rick James,您的建议都导致了答案......这应该很明显将目录作为单独的表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 2016-01-31
  • 1970-01-01
  • 2021-05-27
相关资源
最近更新 更多