qq_38122996 2022-04-08 15:45 采纳率: 100%
浏览 139
已结题

关于按照机构、岗位、职位、用户组等维度灵活指定允许用户参与范围的设计

需要实现一个集团级企业使用的调查问卷功能,每个调查发布时必须指定参与人员的范围,不能对全员发布。
发布调查时管理员可以按照机构(是否包含子机构)、岗位、职位、用户组等维度指定参与人员的范围。
用户端只能查看到参与人员的范围中包含本人的调查,不能查看参与人员的范围中没有本人的调查。

机构是树形结构,选中一个机构时,如果选择了包含子机构,那么选中机构及其所有子机构的用户都可以看到此调查。如果未选择包含子机构,那么只能是选中机构下的用户能够看到此调查。

用户组也是一个多种维度的用户分类,如用户组1是北京分公司30岁以下男员工和上海分公司30以上党员的集合。

各位大师帮忙说说具体如何设计才能保证性能,如果用户端通过多个union all sql 查询到本人能够查看到的调查列表效率太低了
十分感谢!

  • 写回答

7条回答 默认 最新

  • DarkAthena ORACLE应用及数据库设计方案咨询师 2022-04-08 15:56
    关注

    这个设计中,有一个很重要的场景,就是在发布问卷后,有新员工入职该公司,是否可以看到此份调查问卷。
    如果业务要求必须看到,那么这个设计就会相对复杂;如果业务方接受可以看不到,那么这个就相对简单。
    即,在问卷发布时,根据参与人员的范围,直接生成"问卷id-用户id-是否已填写"这三列数据,之后用户来检索自己需要的问卷时,就无需关联其他表即可获得自己需要填写的问卷。
    至于生成这个清单,是用or还是union,建议都测试一下,但无论这个清单怎么生成,只要在用户查询前生成了,那么就不会影响到用户的查询效率。
    如果生成这个清单所消耗的时间在应用端不可忍受,那么可以引入一个异步处理,即增加"发布中"的状态,等后台程序处理完了,再更新状态,这样前端也可以通过手动刷新页面来查看是否发布成功


    问卷平均有效期多长?
    建议用两个不同的表,一个是当前处于生效及待生效的"问卷-用户"清单,一个是处于失效期的清单,每晚批处理将前一日失效数据转至失效问卷表内,这样可以让经常被查询的这个表处于一个相对稳定的行数。况且如果不把这个列表记录下来,如果要查历史某个问卷的参与度,就无法计算了,因为当前的用户数并不代表历史的用户数。而且字段少的话并不会占用多少存储空间,只是要注意考虑到历史数据清理,建议表上要有日期字段,甚至可以按时间范围来对表进行分区。
    至于新员工入职,可以在新员工信息创建的时候,扫一次问卷,看看哪些问卷是需要填的,自动补几行记录到上面说的这个表


    两个极致,

    1. 粗暴定时全量刷新,逻辑简单,较为准确,但消耗太大;
    2. 把逻辑写到用户信息变更这个环节,只要提交了任意一个用户信息变更,就根据这个用户最新的资料,匹配一次问卷,对当前该用户的问卷列表进行刷新,这样可以将开销分散到每一次用户信息变更里。这个功能可以封装成一个单独的接口,传入用户id即可刷新此用户的问卷列表,虽然增加了耦合性,但也不会太高,出现问题可以紧急先停掉,将第一种方案的全量刷新作为一个应急方案或者说数据修复方案,两手准备
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(6条)

报告相同问题?

问题事件

  • 系统已结题 4月16日
  • 已采纳回答 4月8日
  • 创建了问题 4月8日

悬赏问题

  • ¥15 公交车和无人机协同运输
  • ¥15 stm32代码移植没反应
  • ¥15 matlab基于pde算法图像修复,为什么只能对示例图像有效
  • ¥100 连续两帧图像高速减法
  • ¥15 组策略中的计算机配置策略无法下发
  • ¥15 如何绘制动力学系统的相图
  • ¥15 对接wps接口实现获取元数据
  • ¥20 给自己本科IT专业毕业的妹m找个实习工作
  • ¥15 用友U8:向一个无法连接的网络尝试了一个套接字操作,如何解决?
  • ¥30 我的代码按理说完成了模型的搭建、训练、验证测试等工作(标签-网络|关键词-变化检测)