当前位置: 首页 > news >正文

java网盘项目 目前 文件有分享表 文件夹也要创建分享表吗

java网盘项目 目前 文件有分享表 文件夹也要创建分享表吗

根据网盘系统的典型设计模式及搜索结果中的最佳实践,建议为文件夹创建独立的分享表。以下是具体分析及实施建议:


一、需要独立文件夹分享表的核心原因

  1. 权限控制差异

    • 文件分享:通常基于临时链接或短期权限(如7天有效)
    • 文件夹分享:需支持协作继承、递归权限、长期管理(如部门共享)
      示例差异对比:
      | 功能维度 | 文件分享表 | 文件夹分享表需求 |
      |----------------|--------------------------|-------------------------------|
      | 权限继承 | 不支持 | 需支持子文件/夹自动继承 |
      | 有效期管理 | 短期(按天计) | 长期(按年计或无限制) |
      | 操作类型 | 仅下载/预览 | 上传/删除/重命名等协作操作 |
  2. 数据结构复杂度

    • 文件夹分享需存储层级关系字段(如parent_folder_id),而文件分享表无此需求

二、文件夹分享表设计建议

  1. 核心字段定义

    CREATE TABLE folder_share (
      share_id BIGINT PRIMARY KEY,
      folder_id BIGINT,          -- 关联folder表 
      target_type ENUM('user', 'group', 'public'),  -- 分享对象类型
      target_id VARCHAR(64),     -- 用户ID/群组ID(若target_type=public则空)
      permission_mask INT,      -- 权限掩码(1=读, 2=写, 4=删除等)
      expire_time DATETIME,      -- 过期时间(可为空表示永久有效)
      created_by VARCHAR(64)     -- 创建者ID 
    );
    
  2. 与文件分享表的关系

    对比项文件分享表文件夹分享表
    关联主键file_idfolder_id
    典型使用场景生成下载链接团队协作空间管理

三、典型场景实现逻辑

  1. 权限校验流程

    用户访问文件夹
    是否在folder_share表中
    检查permission_mask权限位
    拒绝访问

    注:需递归检查父文件夹权限继承

  2. 协作功能扩展

    • 在文件夹分享表中增加allow_invite字段,控制协作者能否邀请他人
    • 通过permission_mask & 8判断是否拥有管理权限(如设置8=管理位)

四、性能优化策略

  1. 缓存设计

    # 示例:Redis缓存文件夹权限 
    redis_key = f"folder_perm:{user_id}:{folder_id}"
    redis.setex(redis_key, 3600, permission_mask)
    
  2. 索引优化

    -- 联合索引加速查询 
    CREATE INDEX idx_folder_share ON folder_share(folder_id, target_type);
    

五、不推荐共用文件分享表的风险

  1. 数据冗余:需为文件夹增加is_folder标记字段,导致30%以上的空字段浪费
  2. 查询性能下降:获取文件夹权限需联表查询+递归,响应时间可能超过200ms

结论建议
必须创建独立文件夹分享表,可参考飞书的folder_share结构与坚果云的权限继承模型实现。若当前系统处于早期阶段,可先实现基础字段(如folder_idtarget_type),后续逐步扩展协作功能。

http://www.dtcms.com/a/98252.html

相关文章:

  • 伯恩茅斯 vs 曼城
  • Java 输入流到输出流
  • 开发过程中需要安装的浏览器插件
  • 【学Rust写CAD】17 通用2D仿射变换矩阵结构体(matrix/generic.rs)
  • keil中文注释出现乱码怎么解决
  • Selenium自动化测试中常见报错类型及解决方案
  • 【Qt】三种操作sqlite3的方式及其三种多表连接
  • 总结PostgreSQL创建数据库失败的解决办法
  • SQL语句及其应用(中)(DQL语句之单表查询)
  • 机器学习的一百个概念(1)单位归一化
  • java项目之基于ssm的乡镇自来水收费系统(源码+文档)
  • 签名计算:对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序)【java版本、JS(Vue)、iOS版本的实现】
  • LocalDateTime序列化总结
  • 接龙数列(最长上升 动规)
  • 第十六章 常用算法
  • 自动化与智能化的认知差异
  • 【即插即用涨点模块-卷积】SPDConv空间深度卷积,助力小目标与低分辨有效涨点【附源码+注释】
  • 28_跨域
  • Android设计模式之模板方法模式
  • 如何在 AI 搜索引擎(GEO)霸屏曝光,快速提升知名度?
  • RabbitMQ高级特性--重试特性
  • 【C++初阶】第12课—list
  • 人工智能入门(1)
  • 字符和字符串的输入方式
  • 安当SLAc操作系统安全登录解决方案:破解设备供应商Windows权限失控困局
  • 全自动数字网络机器人:重塑未来的无形引擎 ——从金融量化到万物互联,为何必须“ALL IN”?
  • MySQL 中的表连接(JOIN)详解
  • 六十天前端强化训练之第三十五天之Jest单元测试大师课:从入门到实战
  • 【C++20】format格式化输出
  • 每日一题 == 674. 最长连续递增序列