
1) 【一句话结论】招聘信息平台数据库设计需构建职位、用户、匹配等核心表,通过企业认证表(含状态、证书ID)约束企业真实性,匹配记录表加唯一索引防重复,结合索引、事务及分布式方案保障数据一致性与查询效率,支持职位发布、用户匹配等核心业务。
2) 【原理/概念讲解】数据库设计需遵循第三范式减少冗余,同时优化查询性能。职位表需添加状态字段(如is_active,布尔值,标记职位是否有效,避免过期职位被搜索);企业认证信息单独表(认证表),关联用户表企业ID,用外键约束状态(如已认证/失效),确保职位发布前验证企业状态。用户表求职者专业用JSON存储多专业,但需预计算专业标签(创建标签表,解析major字段为标签并建立索引),优化查询性能。分布式环境下,匹配记录表加乐观锁(如version字段),结合最终一致性或Saga模式处理并发冲突。类比:职位表是企业发布的“商品”,用户表是顾客档案,匹配表是订单,索引是商品目录的页码,事务是订单提交的锁机制,确保数据一致。
3) 【对比与适用场景】
| 表名 | 关键字段 | 设计说明 | 适用场景 | 注意点 |
|---|---|---|---|---|
| 职位表(Job) | job_id, company_id, job_title, salary_min, salary_max, location, is_active | 企业ID关联用户表,薪资分区间,位置索引,状态字段标记有效性 | 企业发布职位,求职者搜索 | 企业ID需关联有效认证企业,is_active=1表示有效 |
| 用户表(User) | user_id, user_type, name, major(JSON数组),company_info(JSON) | 用户类型枚举,求职者专业JSON存储多值,企业信息含认证字段 | 用户注册,匹配时筛选专业/城市 | JSON存储需预计算专业标签(如标签表),优化查询 |
| 认证表(Certification) | cert_id, company_id, status(ENUM),certificate_id | 企业认证状态+证书ID,外键关联用户表企业ID | 验证企业真实性,约束职位发布 | 状态字段唯一约束,避免重复认证,触发器检查状态 |
| 匹配记录表(MatchRecord) | match_id, job_id, user_id, version | 唯一索引防重复,乐观锁版本字段防并发冲突 | 记录用户关注/申请,分析行为 | 唯一索引(job_id, user_id),版本字段处理并发 |
| 标签表(MajorTag) | tag_id, tag_name | 解析用户专业JSON为标签,建立索引 | 优化专业查询(如按专业筛选) | 与用户表关联,建立外键索引 |
4) 【示例】
-- 假设数据库为MySQL,创建表
-- 1. 用户表(含企业认证关联)
CREATE TABLE User (
user_id INT PRIMARY KEY AUTO_INCREMENT,
user_type ENUM('企业', '求职者') NOT NULL,
name VARCHAR(50) NOT NULL,
major JSON DEFAULT NULL,
company_info JSON DEFAULT NULL,
INDEX idx_type_city (user_type, city)
);
-- 2. 认证表(企业认证状态)
CREATE TABLE Certification (
cert_id INT PRIMARY KEY AUTO_INCREMENT,
company_id INT NOT NULL,
status ENUM('未认证', '已认证', '失效') NOT NULL,
certificate_id VARCHAR(200) NOT NULL,
FOREIGN KEY (company_id) REFERENCES User(user_id) ON DELETE CASCADE
);
-- 3. 职位表(关联企业认证,加状态字段)
CREATE TABLE Job (
job_id INT PRIMARY KEY AUTO_INCREMENT,
company_id INT NOT NULL,
job_title VARCHAR(100) NOT NULL,
salary_min INT,
salary_max INT,
location VARCHAR(50) NOT NULL,
publish_time DATETIME NOT NULL,
is_active BOOLEAN DEFAULT TRUE,
INDEX idx_company (company_id),
INDEX idx_title_location (job_title, location),
FOREIGN KEY (company_id) REFERENCES User(user_id) ON DELETE CASCADE,
FOREIGN KEY (company_id) REFERENCES Certification(company_id) ON UPDATE CASCADE
);
-- 4. 匹配记录表(唯一索引+乐观锁)
CREATE TABLE MatchRecord (
match_id INT PRIMARY KEY AUTO_INCREMENT,
job_id INT NOT NULL,
user_id INT NOT NULL,
version INT DEFAULT 1,
INDEX idx_job_user (job_id, user_id) UNIQUE,
FOREIGN KEY (job_id) REFERENCES Job(job_id) ON DELETE CASCADE,
FOREIGN KEY (user_id) REFERENCES User(user_id) ON DELETE CASCADE
);
-- 5. 标签表(预计算专业标签)
CREATE TABLE MajorTag (
tag_id INT PRIMARY KEY AUTO_INCREMENT,
tag_name VARCHAR(50) NOT NULL UNIQUE
);
-- 6. 发布职位时检查企业认证的触发器
DELIMITER //
CREATE TRIGGER check_company_certification
BEFORE INSERT ON Job
FOR EACH ROW
BEGIN
DECLARE cert_status VARCHAR(20);
SELECT status INTO cert_status FROM Certification WHERE company_id = NEW.company_id;
IF cert_status != '已认证' THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '企业未通过认证,无法发布职位';
END IF;
END //
DELIMITER ;
5) 【面试口播版答案】面试官您好,设计招聘信息平台的数据库表结构,核心是构建职位、用户、匹配等核心表,并通过企业认证表(含状态、证书ID)约束企业真实性,匹配记录表加唯一索引防止重复记录,结合索引、事务及分布式方案保障数据一致性与查询效率。具体来说,职位表关联企业ID(需通过认证表验证状态,并添加is_active字段标记有效性,避免过期职位被搜索),用户表区分求职者/企业,求职者专业用JSON存储多值,但通过预计算专业标签(创建标签表并建立索引)优化查询性能,匹配表通过唯一索引(job_id, user_id)并添加乐观锁版本字段,防止并发冲突。数据一致性通过外键约束(如企业认证状态必须为有效值)和触发器(发布职位时检查认证状态,失败回滚)保障,确保职位发布、用户匹配等核心业务高效运行。
6) 【追问清单】
major字段解析为标签表,建立索引)优化性能,减少实时解析开销。version字段),结合分布式事务协调,确保并发场景下冲突处理。is_active有什么作用?答:标记职位是否有效,过滤过期或无效职位,提升搜索效率,避免用户看到已失效的职位信息。7) 【常见坑/雷区】
is_active,导致过期职位被搜索,影响用户体验。