职位选择

【职问问P2】1 大V邀请模块 JAVA开发设计文档官方补充版

03月19日 JAVA开发文档说明 大V邀请模块 职问问P2
视频说明
点击观看
学生周最佳
暂时没有
最后修订
2025-03-19

​​一 说明

本期主要集中在大V列表的生成,和周回答率的计算;

写的比较快,可能有少量问题,可以在群内讨论


二 亮点说明


1 【亮点】大V列表的生成

由公司、部门、职位三个要素决定

注:因为P1的设计大家不清楚,说明一下这3个要素的关系 

公司和职位是第一维度的 就是有单独的公司表和职位表 也就是有单独的companyId 和单独的positionId

部门是公司的子表,也就是部门表是与companyId关联的,再关联posititions(逗号分割)

这里给出相关的简化表(只需要考虑关键属性)

1.1 vip_user(用户简表)

字段

类型

可空

备注

id

int(11)


自增

userName

varchar(20)


姓名

avator

varchar(50)


头像

Status

tinyint(1)



AddTime

dateTime



UpdateTime

dateTime


更新时间

1.2 vip_company(公司简表)

字段

类型

可空

备注

id

int(11)


自增

name

varchar(20)


公司名

logo

varchar(50)


公司logo

plateId

int(11)


板块Id

Status

tinyint(1)



AddTime

dateTime



UpdateTime

dateTime


更新时间

1.3 vip_position(职位简表)

字段

类型

可空

备注

id

int(11)


自增

name

varchar(20)


职位名

Status

tinyint(1)



AddTime

dateTime



UpdateTime

dateTime


更新时间

1.4 vip_department_position(部门和职位简表)

字段

类型

可空

备注

id

int(11)


自增

companyId

int(11)


公司id

name

varchar(50)


部门名

positionIds

varchar(200)


1,5,7 

AddTime

dateTime



UpdateTime

dateTime


更新时间


1.5 数量规则

(1)条件下 >10个

按按分数划分前30%为大大V(取3人),后70%为普通大V(取7人)

问题点:因可能部分大厂大V较多,不方便都查询出来之后,再做随机;

技术方案:sql语句直接返回每段的随机人数(3-7)两次查询;暂不使用redis缓存结果

(2)查询结果 =10

直接返回,按分值从大到小排序

(3)查询结果 <10

从同公司其他部门相同职位补全;依然不足时补充不同公司同职位Top列表。

问题点:数据库查询较多,需要进一步优化性能

技术方案:

1 符合查询条件的(<10)a条数据放到列表前面,按分值从大到小排序

2 从同公司其他部门相同职位补全(与部门无关),

  大于(10-a)则随机出来-》这一步要联查多张表,且大概率出现,需要提高性能-》

  redis每天半夜2点 放每个公司每个职位的前20人,不走数据库查询;所有跨部门的 都走redis 但是需要与本部门去重(redis主键 vip + companyid + positionid)

3 position补全(与公司无关)

 redis每天半夜3点 放每个职位的前50人,不走数据库查询;(redis主键 vip+ positionid)


二 【亮点】周回答率的生成


两天前的处理,每天半夜4点,定时计算更新大V表的数据

性能估算:大大V一周100个帖子 大v平均10个 1万个大V ;每天半夜计算量依然较大

性能优化:暂时大V较少不优化,后序使用ES或者其它数据形式优化



三 服务设计



四 数据表设计


1 xiaozhaoVIP__VV 大V表

字段

类型

可空

备注

id

int(11)


自增

UserId

int(11)


用户id

UserName

varchar(20)


用户名(冗余)

Avator

varchar(50)


头像(冗余)

CompanyId

int(11)



CompanyName

varchar(50)



DepartmentId

int(11)



DepartmentName

varchar(50)



PositionId

int(11)


这个也是用户所有的职位

PositionName

varchar(50)



Status

tinyint(2)



Score

int(11)


用户分值,没有小数

AnsweredNum

int(11)


总已答数

AnsweringNum

int(11)


总未答数

WeekAnsweredNum

int(11)


两天前 一周内已答数(对本时间段内问题的回答)

WeekAnsweringNum

int(11)


两天前 一周内未答数

AddTime

dateTime



UpdateTime

dateTime


更新时间


历史周最佳