
1) 【一句话结论】
核心是设计四张表(招聘方、求职者、职位、投递),通过外键关联实现多对多关系,并针对关键词、行业、地区等筛选字段建立索引,确保数据关联性与查询性能。
2) 【原理/概念讲解】
老师口吻:咱们先理清实体关系,就像“商家-商品-顾客”的模型——招聘方(Employer)是“商家”,职位(Job)是“商品”,求职者(Candidate)是“顾客”,投递(Application)是“订单”。
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)。其中,招聘方和职位是一对多关系,求职者和职位是多对多关系,所以通过投递表关联。然后针对筛选需求(关键词、行业、地区),在求职者表、职位表的行业、地区字段,以及投递表的投递时间字段建立索引,优化查询性能。具体来说,表结构如下:
6) 【追问清单】
employer_id外键,并建立基于employer_id的权限控制(如行级安全RLS)。job_id和candidate_id的组合唯一约束,或前端校验。province(省份)和city(城市)两个字段,或使用地理编码(如GeoHash),但根据场景,先按字符串存储,再建立索引。7) 【常见坑/雷区】