管理存储在 MySQL table 中的路径字符串

Managing path strings stored in MySQL table

我正在 JS + PHP + MySQL.

上做一个基于网络的小文件浏览器

我选择了两个 table:一个带有文件夹路径,第二个带有来自第一个 table 的文件夹 ID 加上文件名。所以它看起来像这样:

文件夹 table:

|------------------------------------|
|id    |relative_path|status|owner_id|
|------------------------------------|
|1     |me           |1     |333     |
|2     |me/you       |1     |333     |
|3     |me/you/us    |1     |333     |
|------------------------------------|

文件 table:

|---------------------------------------------------------|
|id    |folder_id|file_name|status|realpath               |
|---------------------------------------------------------|
|1     |1        |file1    |1     |/datetime_rand/file1   |
|2     |2        |file2    |1     |/datetime_rand/file2   |
|3     |3        |file77   |1     |/datetime_rand/file77  |
|---------------------------------------------------------|

如果用户需要删除一个文件夹,那么其中的所有子文件夹和文件显然也需要删除(我将状态从 1 更改为 0 以将文件记录标记为已删除)。

到目前为止,我已经想出了如何 "delete" 文件夹和其中的所有文件而不需要递归:

UPDATE folders d 
LEFT JOIN files f ON d.id = f.folder_id 
SET d.status = 0 AND f.status = 0 
WHERE d.id = ?

我只有 folder.id (d.id) 作为传入参数删除

删除所有子文件夹最有效的方法是什么?我可以在单个查询中完成所有操作吗?有什么办法可以避免全文搜索,或者不会很慢?

UPDATE folders fo 
INNER JOIN files fi ON fo.id = fi.folder_id 
SET fo.status = 0, 
    fi.status = 0 
WHERE fo.relative_path LIKE CONCAT( @folder_to_delete, '%' )