管理存储在 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, '%' )
我正在 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, '%' )