51mee - AI智能招聘平台Logo
模拟面试题目大全招聘中心会员专区

在招聘SaaS平台中,设计用户(招聘方、求职者)与职位的数据模型。请考虑以下场景:招聘方可创建多个职位,每个职位关联多个求职者;求职者可投递多个职位;需支持按关键词、行业、地区筛选职位。请设计数据库表结构(表名、字段、主键、外键),并说明索引优化策略。

八方职达 | 广州创思信息技术有限公司游戏系统策划难度:中等

答案

1) 【一句话结论】
核心是设计四张表(招聘方、求职者、职位、投递),通过外键关联实现多对多关系,并针对关键词、行业、地区等筛选字段建立索引,确保数据关联性与查询性能。

2) 【原理/概念讲解】
老师口吻:咱们先理清实体关系,就像“商家-商品-顾客”的模型——招聘方(Employer)是“商家”,职位(Job)是“商品”,求职者(Candidate)是“顾客”,投递(Application)是“订单”。

  • 一对多关系:一个招聘方可创建多个职位(Employer→Job),所以职位表需关联招聘方ID(外键)。
  • 多对多关系:一个求职者可投递多个职位,一个职位可关联多个求职者,这种关系不能直接关联,需通过中间表(投递表)实现(Job×Candidate→Application)。
  • 索引优化:筛选(关键词、行业、地区)属于“范围查询”,需用B树索引(如MySQL的BTree索引),它能高效定位数据;若需全文检索(如关键词),可考虑全文索引(如FULLTEXT)或ES(Elasticsearch)。

3) 【对比与适用场景】

设计方案定义特性使用场景注意点
多对多中间表(推荐)职位表与求职者表通过投递表关联数据结构清晰,支持多对多,可记录投递时间等大规模SaaS平台,多对多关系复杂需额外维护投递表
直接关联(职位表+求职者ID数组)职位表中存储求职者ID数组结构简单,无额外表小规模数据,关系简单数据冗余,数组存储复杂

4) 【示例】

  • 表结构:
    • Employer(招聘方表):employer_id(INT, 主键)、name(VARCHAR)、contact(VARCHAR)、created_at(DATETIME)。
    • Candidate(求职者表):candidate_id(INT, 主键)、name(VARCHAR)、email(VARCHAR)、industry(VARCHAR)、region(VARCHAR)、created_at(DATETIME)。
    • Job(职位表):job_id(INT, 主键)、title(VARCHAR)、description(TEXT)、industry(VARCHAR)、region(VARCHAR)、employer_id(INT, 外键)、created_at(DATETIME)。
    • Application(投递表):application_id(INT, 主键)、job_id(INT, 外键)、candidate_id(INT, 外键)、applied_at(DATETIME)、status(ENUM)。
  • 索引设计:
    • Candidate表:candidate_id(主键)、email(索引)、industry(索引)、region(索引)。
    • Job表:job_id(主键)、employer_id(索引)、industry(索引)、region(索引)。
    • Application表:application_id(主键)、job_id(索引)、candidate_id(索引)、applied_at(索引)。

5) 【面试口播版答案】
“面试官您好,针对SaaS平台中招聘方、求职者与职位的关系设计,核心是构建四张表:招聘方表(Employer)、求职者表(Candidate)、职位表(Job)和投递表(Application)。其中,招聘方和职位是一对多关系,求职者和职位是多对多关系,所以通过投递表关联。然后针对筛选需求(关键词、行业、地区),在求职者表、职位表的行业、地区字段,以及投递表的投递时间字段建立索引,优化查询性能。具体来说,表结构如下:

  • 招聘方表存储招聘方信息,职位表关联招聘方ID;
  • 求职者表存储求职者信息,投递表通过职位ID和求职者ID关联两者;
  • 索引方面,对行业、地区等筛选字段建立B树索引,确保快速检索。这样既能保证数据关联性,又能满足筛选需求。”

6) 【追问清单】

  • 问题1:若数据量很大(百万级职位、千万级投递),如何优化索引或表结构?
    回答要点:考虑分库分表,或使用覆盖索引减少I/O,或对高频查询字段建立复合索引。
  • 问题2:是否考虑招聘方的权限管理?比如不同招聘方只能查看自己的职位?
    回答要点:可在职位表中增加employer_id外键,并建立基于employer_id的权限控制(如行级安全RLS)。
  • 问题3:如何处理求职者投递职位的重复情况?
    回答要点:在投递表中增加job_id和candidate_id的组合唯一约束,或前端校验。
  • 问题4:若需支持按关键词(职位描述、求职者技能)筛选,如何设计?
    回答要点:可建立全文索引(如MySQL的FULLTEXT索引),或使用ES(Elasticsearch)进行全文检索。
  • 问题5:地区字段如何存储?比如省份+城市?
    回答要点:可拆分为province(省份)和city(城市)两个字段,或使用地理编码(如GeoHash),但根据场景,先按字符串存储,再建立索引。

7) 【常见坑/雷区】

  • 忽略多对多关系,直接在职位表中存储求职者ID数组,导致数据冗余和查询复杂。
  • 未建立针对筛选字段的索引,导致查询性能下降。
  • 字段类型选择不当(如地区用字符串但未优化索引,或行业字段未索引)。
  • 忽略招聘方的权限控制,导致数据安全风险。
  • 未考虑投递表的唯一性约束,导致重复投递。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1