
1) 【一句话结论】采用“结构化数据存储在MySQL(主键+外键索引),非结构化数据存储在Elasticsearch(倒排索引)”,通过两阶段提交(2PC)或消息队列+补偿机制保证数据一致性,并设计冷热数据分离优化非结构化数据存储成本与性能。
2) 【原理/概念讲解】
结构化数据(如职位ID、发布时间)适合关系型数据库(RDBMS),因为其强一致性、事务支持(类比“结构化数据像图书馆的目录——有固定格式,可快速定位”);非结构化数据(如职位描述)适合NoSQL(如Elasticsearch),因为其支持全文检索(类比“非结构化数据像图书馆的书籍内容——无固定格式,但可通过关键词快速查找”)。
索引策略方面,结构化数据用B树索引(如职位ID主键、发布时间索引),非结构化数据用倒排索引(如职位描述的倒排索引,快速匹配关键词);数据一致性处理采用两阶段提交(2PC)或消息队列+补偿机制,确保跨库强一致性。
3) 【对比与适用场景】
| 特性 | 关系型数据库(MySQL) | NoSQL(Elasticsearch) |
|---|---|---|
| 数据模型 | 行-列结构(表) | 文档结构(JSON/键值) |
| 事务支持 | 强(ACID) | 弱/无(部分支持) |
| 查询能力 | SQL查询(结构化) | 全文检索(非结构化) |
| 扩展性 | 垂直扩展(硬件升级) | 水平扩展(增加节点) |
| 适用场景 | 结构化数据(职位ID、单位类型) | 非结构化数据(职位描述、岗位要求) |
索引策略对比:
| 索引类型 | B树索引(结构化) | 倒排索引(非结构化) |
|---|---|---|
| 原理 | 树形结构,按键排序,快速定位 | 将文本拆分词,建立词-文档映射,快速匹配关键词 |
| 适用场景 | 结构化数据的高效查询(如按职位ID、发布时间) | 非结构化数据的全文检索(如搜索“Java开发”) |
| 注意点 | 避免过度索引(影响写入性能) | 需要分词器(如中文分词)优化检索 |
4) 【示例】
job_id (INT, 主键, AUTO_INCREMENT),publish_time (DATETIME, 索引),unit_id (INT, 外键关联单位表),unit_type (VARCHAR, 索引);unit_id (INT, 主键),unit_name (VARCHAR, 可更新字段);job_id主键,publish_time B树索引,unit_type 索引,unit_id 外键索引。job_id (INT, 关联字段),description (TEXT, 全文检索),requirements (TEXT, 全文检索)(通过API将结构化数据中的job_id关联到Elasticsearch文档)。UPDATE unit SET unit_name = '新名称' WHERE unit_id = X;unit_name字段);5) 【面试口播版答案】
面试官您好,针对招聘信息推荐平台的数据存储需求,我设计的数据库架构是:结构化数据(如职位ID、发布时间)存储在MySQL等关系型数据库,非结构化数据(如职位描述)存储在Elasticsearch等NoSQL数据库。具体来说,职位表(结构化)包含job_id(主键)、publish_time(B树索引)、unit_type(索引)等字段,单位表(结构化)包含unit_id(主键)和unit_name(可更新字段);职位描述通过Elasticsearch的job_id关联字段存储,支持全文检索。索引策略上,结构化数据用B树索引提升查询效率,非结构化数据用倒排索引实现快速关键词匹配。数据一致性方面,单位信息变更时,先在MySQL执行两阶段提交事务(更新单位表,然后通知Elasticsearch更新关联文档),确保跨库强一致性;若Elasticsearch更新失败,则回滚MySQL操作,避免数据不一致。同时,非结构化数据采用冷热分离,高频访问的文档存储在热节点(Elasticsearch主节点),低频访问的文档定期归档到冷存储(如对象存储),降低成本。这样既满足结构化数据的强一致性,又通过NoSQL提升非结构化数据的检索性能,同时优化存储成本。
6) 【追问清单】
7) 【常见坑/雷区】