java 网盘项目 那我之前有一个菜单是 文件管理 里面有文件 和文件分享 和表, 现在有菜单文件夹管理 那文件夹管理的 分享文件 或者文件夹 分享的 数据都 保存到 文件夹 分享表

java 网盘项目 那我之前有一个菜单是 文件管理 里面有文件 和文件分享 和表, 现在有菜单文件夹管理 那文件夹管理的 分享文件 或者文件夹 分享的 数据都 保存到 文件夹 分享表

根据网盘系统设计经验和搜索结果中的最佳实践,建议采用以下方案处理文件夹与文件分享的存储及关联逻辑:


一、分享表设计原则

  1. 独立文件夹分享表

    • 必须新建folder_share表,与原有file_share表并存,原因包括:
      ✅ 权限差异:文件夹分享通常涉及多层级权限继承(如子文件自动继承父文件夹权限)
      ✅ 时效性差异:文件分享多为短期临时链接,文件夹分享多用于长期协作场景
      ✅ 数据结构差异:文件夹分享需记录is_recursive字段控制是否递归应用到子内容
  2. 表结构对比

    字段 文件分享表(file_share) 文件夹分享表(folder_share)
    目标对象ID file_id folder_id
    分享类型 链接分享/指定用户 协作空间/部门共享
    权限范围 仅当前文件 可递归控制子文件/文件夹
    有效期 必填(默认7天) 可选(长期有效常见)

二、关联与查询逻辑

  1. 数据存储规则

    • 文件分享:继续使用原有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 
      );
      
  2. 混合查询场景

    • 获取用户所有分享项时需联合查询两表:
      (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)
      
    • 权限校验时需优先判断对象类型:
      文件
      文件夹
      收到访问请求
      对象类型
      查询file_share表
      查询folder_share表
      是否递归权限?
      同时校验子项权限

三、旧数据兼容策略

  1. 历史分享数据迁移

    • 若已有文件夹数据存储在文件表中(通过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);
      
  2. 接口兼容方案

    • 在API层封装统一分享入口,根据type参数自动路由到对应表:
      // 伪代码示例 
      function createShare(itemType, itemId) {
              
              
        if (itemType === 'file') {
              
              
          fileShareTable.insert({
              
              file_id: itemId, ...});
        } else {
              
              
          folderShareTable.insert({
              
              folder_id: itemId, ...});
        }
      }
      

四、典型场景实现参考
场景:分享文件夹时包含子文件

  1. 前端展示权限继承开关:
    !
  2. 后端校验逻辑:
    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 
    

演进建议

  1. 短期方案:保持两表独立,通过接口层统一交互
  2. 长期方案:可设计share超级表,通过target_type字段区分文件/文件夹(需改造现有表结构)