java 网盘项目 那我之前有一个菜单是 文件管理 里面有文件 和文件分享 和表, 现在有菜单文件夹管理 那文件夹管理的 分享文件 或者文件夹 分享的 数据都 保存到 文件夹 分享表
根据网盘系统设计经验和搜索结果中的最佳实践,建议采用以下方案处理文件夹与文件分享的存储及关联逻辑:
一、分享表设计原则
-
独立文件夹分享表
- 必须新建
folder_share
表,与原有file_share
表并存,原因包括:
✅ 权限差异:文件夹分享通常涉及多层级权限继承(如子文件自动继承父文件夹权限)
✅ 时效性差异:文件分享多为短期临时链接,文件夹分享多用于长期协作场景
✅ 数据结构差异:文件夹分享需记录is_recursive
字段控制是否递归应用到子内容
- 必须新建
-
表结构对比
字段 文件分享表(file_share) 文件夹分享表(folder_share) 目标对象ID file_id folder_id 分享类型 链接分享/指定用户 协作空间/部门共享 权限范围 仅当前文件 可递归控制子文件/文件夹 有效期 必填(默认7天) 可选(长期有效常见)
二、关联与查询逻辑
-
数据存储规则
- 文件分享:继续使用原有
file_share
表,通过file_id
关联文件表 - 文件夹分享:新建
folder_share
表,通过folder_id
关联文件夹表
示例SQL:-- 文件夹分享表 CREATE TABLE folder_share ( share_id INT PRIMARY KEY, folder_id INT REFERENCES folder(folder_id), permission_mask INT, -- 如0x755(读写执行权限) is_recursive BOOLEAN DEFAULT TRUE, expire_time DATETIME );
- 文件分享:继续使用原有
-
混合查询场景
- 获取用户所有分享项时需联合查询两表:
(SELECT 'file' AS type, file_id AS id FROM file_share WHERE user_id=xxx) UNION (SELECT 'folder' AS type, folder_id AS id FROM folder_share WHERE user_id=xxx)
- 权限校验时需优先判断对象类型:
- 获取用户所有分享项时需联合查询两表:
三、旧数据兼容策略
-
历史分享数据迁移
- 若已有文件夹数据存储在文件表中(通过
is_folder
标记),需执行数据迁移:-- 将文件夹类分享从file_shift到folder_share INSERT INTO folder_share (folder_id, ...) SELECT file_id, ... FROM file_share WHERE EXISTS (SELECT 1 FROM file WHERE file_id=id AND is_folder=TRUE);
- 若已有文件夹数据存储在文件表中(通过
-
接口兼容方案
- 在API层封装统一分享入口,根据
type
参数自动路由到对应表:// 伪代码示例 function createShare(itemType, itemId) { if (itemType === 'file') { fileShareTable.insert({ file_id: itemId, ...}); } else { folderShareTable.insert({ folder_id: itemId, ...}); } }
- 在API层封装统一分享入口,根据
四、典型场景实现参考
场景:分享文件夹时包含子文件
- 前端展示权限继承开关:
! - 后端校验逻辑:
def check_permission(user, folder_id, path): # 先查文件夹直接权限 if not folder_share.has_access(user, folder_id): return False # 若开启递归,校验路径中所有父文件夹 if is_recursive: for parent in get_parent_folders(path): if not folder_share.has_access(user, parent.id): return False return True
演进建议
- 短期方案:保持两表独立,通过接口层统一交互
- 长期方案:可设计
share
超级表,通过target_type
字段区分文件/文件夹(需改造现有表结构)