Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL:存储目录结构并查询_Mysql_Tree - Fatal编程技术网

MySQL:存储目录结构并查询

MySQL:存储目录结构并查询,mysql,tree,Mysql,Tree,我需要能够在MySQL中存储文件和目录,但我不知道如何做到这一点,因此我还可以使用相当高效的查询从表中获取数据,例如/swatcat/supersecret.txt 我最初的想法是: DROP TABLE IF EXISTS objects; CREATE TABLE objects ( ID INT NOT NULL AUTO_INCREMENT, filename VARCHAR(200) NOT NULL, objectTypeID INT NOT NULL,

我需要能够在MySQL中存储文件和目录,但我不知道如何做到这一点,因此我还可以使用相当高效的查询从表中获取数据,例如/swatcat/supersecret.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,那么如何创建一个能够处理它的查询呢?

计划a:将目录路径与文件名放在一个单独的表中的一行中

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


方案C:保持dir/fn不变,然后使用LIKE或RLIKE定位一行,然后使用MariaDB中的SUBSTRING\u INDEX或REGEXP\u REPLACE进行替换。

感谢您对objectTypeId的澄清。我很难理解为什么以分层的方式存储它会有利于在单个记录中存储文件路径和文件名。我非常喜欢在适用的情况下使用父/子关系来存储数据,但对于这个用例来说,这似乎有些过头了。递归CTE的代价可能很高,您可能需要两次传递才能生成UPDATE语句。一次用于生成文件路径并查找您要查找的项目的id,另一次用于对该id应用更新。@jnevil我也这么想,但如果目录发生更改,更新不是很复杂吗?您可以使用replace:UPDATE myTable SET filepath=replacefilepath,“/originaldirname/”,“/newdirname/”。不同之处在于,这将影响更多的记录,而您建议的模式将影响1。但是,如果在不同的路径中有多个同名的目录,情况会变得很糟糕。使用filepath | filename模式选择正确的路径很简单,但是使用父/子模式更复杂,虽然不可怕,但更复杂。Hi。思考过程中产生的疑问/迷惘问题过于笼统,不适合这样做。请阅读并采取行动。这包括总结适当的研究。你的问题应该结束;但现在必须等到奖金结束。此外,SQL和中的分层数据都是常见问题解答。此外,如果没有具体的设计、背景和成本效益功能,任何人都无法权衡设计选项:我目前的一般评论re best等:除非你定义,否则在工程中没有更好/最好的东西。同样不幸的是,所有合理的实用定义都需要大量的经验,其中包含大量的因素,这些因素与对细节的敏感度混乱相互作用。做简单的设计。当你通过测量证明一个设计和你能想到的所有备选方案都有问题时,不管这意味着什么,然后问一个非常具体的问题。这也应该是更好/最好的定义。谢谢你JNevill和Rick James你的建议都得到了答案。。。目录作为单独的表应该是显而易见的。