0

0

mysql在招聘网站中的职位和简历数据库设计

P粉602998670

P粉602998670

发布时间:2026-01-09 05:43:36

|

131人浏览过

|

来源于php中文网

原创

职位表应使用tinyint状态码+独立时间戳字段(published_at/closed_at)并建立联合索引,简历表需拆分教育/工作等子表避免字段爆炸,匹配采用标签倒排索引而非like,申请记录须用事件表分离流程动作。

mysql在招聘网站中的职位和简历数据库设计

职位表 jobs 怎么设计才支持快速筛选和状态流转

招聘网站的职位不是静态信息,要支撑「发布/下架/过期/暂停」多种状态,还要被搜索、排序、推荐。直接用一个 status 字符串字段会埋坑:'online''offline' 这类值难索引,也容易拼错。

建议用 tinyint + 注释方式定义状态码,配合 created_atpublished_atclosed_at 三个时间戳字段,而不是只靠一个 updated_at 推断业务阶段:

CREATE TABLE `jobs` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(128) NOT NULL,
  `company_id` bigint unsigned NOT NULL,
  `status` tinyint NOT NULL DEFAULT 1 COMMENT '1=草稿, 2=已发布, 3=已关闭, 4=已过期',
  `published_at` datetime NULL DEFAULT NULL,
  `closed_at` datetime NULL DEFAULT NULL,
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_company_status_published` (`company_id`, `status`, `published_at`)
) ENGINE=InnoDB;
  • status 不用 enum:MySQL enum 在 ALTER 时锁表且不易迁移;tinyint 更易写条件查询,比如 WHERE status IN (2,3)
  • 单独建 published_at:避免用 status = 2 AND updated_at > DATE_SUB(NOW(), INTERVAL 7 DAY) 这种模糊逻辑判断“最近发布的职位”
  • 联合索引 idx_company_status_published 覆盖高频查询:HR 查自己公司所有「已发布」职位,或运营查某状态下的最新职位

简历resumes 如何避免字段爆炸又保留扩展性

候选人填的信息五花八门:教育经历可能有 3 段,工作经历可能有 5 段,证书可能有 N 个。如果全堆在主表加 edu_1_schooledu_2_school……后期改字段、写查询、做统计全是灾难。

主表只存「快照式」核心字段,结构化数据拆到关联表:

CREATE TABLE `resumes` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `user_id` bigint unsigned NOT NULL,
  `name` varchar(64) NOT NULL,
  `phone` varchar(20) NULL,
  `email` varchar(128) NULL,
  `current_salary` decimal(10,2) NULL,
  `expected_salary_min` decimal(10,2) NULL,
  `expected_salary_max` decimal(10,2) NULL,
  `job_status` tinyint NOT NULL DEFAULT 1 COMMENT '1=在职, 2=离职, 3=应届',
  `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_user_id` (`user_id`)
);

CREATE TABLE `resume_educations` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `resume_id` bigint unsigned NOT NULL,
  `school` varchar(128) NOT NULL,
  `degree` varchar(32) NULL,
  `major` varchar(64) NULL,
  `start_year` smallint NULL,
  `end_year` smallint NULL,
  `is_current` tinyint NOT NULL DEFAULT 0,
  PRIMARY KEY (`id`),
  KEY `idx_resume_id` (`resume_id`)
);
  • 主表不存数组型字段(如 JSON 存多段经历):虽然 MySQL 5.7+ 支持 JSON,但无法高效按「某段教育经历的学校名」做索引查询,也难做范围统计(例如“近 3 年毕业的硕士人数”)
  • resume_educationsresume_work_experiences 等子表必须带 resume_id 索引,否则 JOIN 时性能断崖下跌
  • 不要为「期望城市」「可接受加班强度」等低频字段提前预留一堆 extra_1extra_10:真有需要时再加表或用宽表异步聚合

职位与简历怎么匹配 —— 关键不是 LIKE,而是倒排索引思路

用户搜“Java 后端 上海”,后台不能简单写 WHERE title LIKE '%Java%' AND city = '上海'。这种写法无法利用索引,更没法支持「Java 或 Python」、「3 年经验以上」、「熟悉 Spring Cloud」等组合条件。

SmartB2B行业电子商务
SmartB2B行业电子商务

SmartB2B 是一款基于PHP、MySQL、Smarty的B2B行业电子商务网站管理系统,系统提供了供求模型、企业模型、产品模型、人才招聘模型、资讯模型等模块,适用于想在行业里取得领先地位的企业快速假设B2B网站,可以运行于Linux与Windows等多重服务器环境,安装方便,使用灵活。 系统使用当前流行的PHP语言开发,以MySQL为数据库,采用B/S架构,MVC模式开发。融入了模型化、模板

下载

实际可行的做法是:把职位和简历都转成「标签向量」,存在独立匹配表中,用整数位运算或预计算提升效率:

CREATE TABLE `job_tags` (
  `job_id` bigint unsigned NOT NULL,
  `tag_id` int unsigned NOT NULL,
  PRIMARY KEY (`job_id`, `tag_id`),
  KEY `idx_tag_id` (`tag_id`)
);

CREATE TABLE `tags` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(64) NOT NULL,
  `category` varchar(32) NOT NULL COMMENT 'skill/company/degree/location',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_name_cat` (`name`, `category`)
);
  • 插入职位时,解析 description 提取关键词(如“Spring Boot”、“Docker”),查 tags 表获取 tag_id,批量写入 job_tags
  • 查“Java + 上海 + 3年经验”的简历,就变成:先查出 tag_id 列表,再用 SELECT resume_id FROM resume_tags WHERE tag_id IN (101,205,311) GROUP BY resume_id HAVING COUNT(DISTINCT tag_id) = 3
  • 别依赖全文索引(FULLTEXT):对中文分词支持弱,且无法和结构化字段(如薪资范围、学历要求)做混合过滤

为什么不要用单表存储「职位申请记录」

有人把 job_applications 设计成大宽表:job_idresume_idstatusscoreinterviewer_idfeedbacknext_step_at……看着完整,但很快会出问题。

真实流程中,一次申请可能经历「投递→HR 初筛→技术面试→HR 复谈→Offer→拒签」,每个环节产生新数据(面试纪要、评分细则、录音摘要链接),不是简单改一个 status 就完事。

  • 把流程动作拆成事件表 application_events:每行记录一次状态变更、一次反馈提交、一次提醒发送,带 operator_idcreated_at
  • job_applications 主表只保留最简态:idjob_idresume_idcurrent_statuscreated_at,用于列表页快速展示
  • 历史操作、附件、评分明细全部下沉,避免主表越来越大、备份越来越慢、某个字段改类型牵一发而动全身

复杂度藏在关联关系里,不在单表字段多寡上。字段越多的表,越早遇到 ALTER COLUMN 锁表超时、从库延迟飙升、ORM 映射臃肿的问题。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

682

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

452

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

286

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

519

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

264

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

392

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

541

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

663

2023.08.14

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

48

2026.02.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 2.4万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 842人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号