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

设计一个用于存储毕业生就业数据的数据库表结构,包括至少三个表(如毕业生信息表、就业单位表、就业数据表),并说明表之间的关系(外键)、索引设计以及如何优化查询性能(如就业率统计查询)。

成都理工大学就业指导中心数据处理专员难度:中等

答案

1) 【一句话结论】:采用三表关联设计(毕业生信息、就业单位、就业数据),通过外键建立业务关联,新增“是否签订三方协议”字段细化就业状态,结合复合索引与毕业年份分区表优化查询性能,并设计增量刷新的物化视图,平衡数据一致性与查询效率。

2) 【原理/概念讲解】:数据库表设计需遵循第三范式(3NF),减少冗余。外键(FK)用于关联表间数据,确保数据一致性(如毕业生表主键“学号”作为就业数据表的外键,保证每个就业记录对应唯一毕业生)。索引是加速查询的工具:主键索引唯一标识记录,外键索引加速关联查询,普通索引加速单列查询(如按专业统计),复合索引用于多条件查询(如专业+就业状态)。就业数据表中“是否签订三方协议”字段(0=未签,1=已签)是关键,用于区分不同就业状态,避免就业率统计偏差。类比:毕业生表是“学生档案”,就业单位表是“工作单位信息”,就业数据表是“就业合同记录”,外键是“学生与合同的关联”,索引是“快速找到某个学生的合同信息”,就业状态字段是“合同的有效性标识”。

3) 【对比与适用场景】:

索引类型定义特性使用场景注意点
主键索引表唯一标识列的索引,自增唯一、唯一性约束表主键(如学号)不能为空,自动创建
外键索引关联表的外键列索引唯一或非唯一(外键约束)关联表(如就业数据表学号)级联操作(如删除父表记录时处理子表)
普通索引非唯一列的索引非唯一单列查询(如按专业统计)索引列不能为空(空值索引无效)
复合索引多列组合的索引非唯一复合条件查询(如专业+就业状态)顺序影响查询效率(前缀匹配优先)

4) 【示例】:

  • 毕业生信息表(GraduateInfo):
    CREATE TABLE GraduateInfo (
        student_id INT PRIMARY KEY,
        name VARCHAR(50) NOT NULL,
        major VARCHAR(50),
        graduation_year INT,
        INDEX idx_major (major)  -- 普通索引,加速按专业统计
    );
    
  • 就业单位表(EmploymentUnit):
    CREATE TABLE EmploymentUnit (
        unit_id INT PRIMARY KEY,
        unit_name VARCHAR(100) NOT NULL,
        industry VARCHAR(50),
        location VARCHAR(100),
        INDEX idx_industry (industry)  -- 普通索引,按行业筛选
    );
    
  • 就业数据表(EmploymentData):
    CREATE TABLE EmploymentData (
        record_id INT PRIMARY KEY,
        student_id INT NOT NULL,
        unit_id INT NOT NULL,
        employment_date DATE,
        position VARCHAR(100),
        employment_status INT DEFAULT 0,  -- 0=未就业,1=已就业(签订三方),2=已就业(未签三方)
        is_triple_agree INT DEFAULT 0,  -- 是否签订三方协议(0=否,1=是)
        FOREIGN KEY (student_id) REFERENCES GraduateInfo(student_id) ON DELETE CASCADE,  -- 删除毕业生时删除就业记录
        FOREIGN KEY (unit_id) REFERENCES EmploymentUnit(unit_id) ON DELETE SET NULL,  -- 单位删除时,就业记录单位设为NULL
        INDEX idx_student_id (student_id),  -- 外键索引,加速关联
        INDEX idx_unit_id (unit_id),  -- 外键索引
        INDEX idx_employment_status (employment_status),  -- 索引就业状态,加速就业率统计
        INDEX idx_is_triple_agree (is_triple_agree)  -- 索引三方协议状态,细化统计
    );
    
  • 分区表优化(按毕业年份分区,假设数据量百万级):
    CREATE TABLE EmploymentData (
        record_id INT,
        student_id INT,
        unit_id INT,
        employment_date DATE,
        position VARCHAR(100),
        employment_status INT,
        is_triple_agree INT,
        graduation_year INT,
        PRIMARY KEY (record_id),
        FOREIGN KEY (student_id) REFERENCES GraduateInfo(student_id),
        FOREIGN KEY (unit_id) REFERENCES EmploymentUnit(unit_id),
        PARTITION BY RANGE (graduation_year) (
            PARTITION p2020 VALUES LESS THAN (2021),
            PARTITION p2021 VALUES LESS THAN (2022),
            PARTITION p2022 VALUES LESS THAN (2023),
            PARTITION p2023 VALUES LESS THAN (2024),
            PARTITION p2024 VALUES LESS THAN (2025),
            PARTITION p2025 VALUES LESS THAN (2026),
            PARTITION p2026 VALUES LESS THAN (2027),
            PARTITION p2027 VALUES LESS THAN MAXVALUE
        )
    );
    
  • 物化视图(统计各专业就业率,增量刷新):
    CREATE MATERIALIZED VIEW employment_rate_view AS
    SELECT major, COUNT(*) as employed_count, COUNT(*) as total_count
    FROM GraduateInfo g
    JOIN EmploymentData e ON g.student_id = e.student_id
    WHERE e.employment_status = 1 AND e.is_triple_agree = 1  -- 仅统计已签三方的就业
    GROUP BY g.major;
    CREATE OR REPLACE MATERIALIZED VIEW employment_rate_view AS
    WITH updated_data AS (
        SELECT major, COUNT(*) as employed_count, COUNT(*) as total_count
        FROM GraduateInfo g
        JOIN EmploymentData e ON g.student_id = e.student_id
        WHERE e.employment_status = 1 AND e.is_triple_agree = 1
        GROUP BY g.major
    )
    SELECT * FROM updated_data;
    CREATE EVENT refresh_employment_rate
    ON SCHEDULE EVERY 1 DAY STARTS NOW
    DO
        REFRESH MATERIALIZED VIEW employment_rate_view;
    

5) 【面试口播版答案】:面试官您好,针对毕业生就业数据存储,我设计三表结构:毕业生信息表(存储学号、姓名、专业、毕业年份)、就业单位表(存储单位ID、名称、行业、地点)、就业数据表(记录就业关联及就业状态,新增“是否签订三方协议”字段细化就业情况)。关系上,毕业生表主键“学号”作为就业数据表的外键,就业单位表主键“单位ID”作为就业数据表的外键,实现一对多关联(一个毕业生对应多个就业记录,一个单位对应多个毕业生)。索引设计:毕业生表专业列加普通索引,加速按专业统计;就业数据表学号、单位ID、就业状态、三方协议状态列加索引,加速关联与就业率查询。针对就业率统计(如按专业统计已签三方的就业率),创建物化视图存储统计结果,并采用增量刷新策略,减少实时计算压力。外键级联操作:删除毕业生时自动删除就业记录,单位删除时就业记录单位设为NULL,保证数据一致性。数据量增大时,按毕业年份对就业数据表进行分区,提升查询性能。这样既保证数据完整,又提升查询效率。

6) 【追问清单】:

  • 问:如何处理同一毕业生多次就业的情况?→ 回答:通过记录ID唯一标识,学号+就业时间组合作为唯一键,避免重复,确保就业率统计准确。
  • 问:数据量增大时(如百万级记录),分区表如何选择分区列?→ 回答:按毕业年份分区,因为就业数据按年份增长,分区可提升查询性能(如查询某年毕业生就业情况)。
  • 问:物化视图增量刷新如何实现?→ 回答:通过只更新变化的数据(如新增或修改的就业记录),减少刷新时间,保持统计结果实时性。
  • 问:外键级联操作是否会影响删除性能?→ 回答:级联删除会触发子表删除操作,增加删除延迟,但保证数据一致性,可通过批量删除或事务优化。
  • 问:是否考虑了未来扩展(如新增“就业城市”列?)→ 回答:在就业单位表增加城市列,或新增就业城市表,通过外键关联,保持现有结构扩展性。

7) 【常见坑/雷区】:

  • 外键未设置级联操作,导致数据不一致(如删除毕业生时就业记录残留)。
  • 索引过多,影响插入/更新性能(如每个列都加索引,导致写操作变慢)。
  • 未区分“已就业(签订三方)”与“已就业(未签三方)”,导致就业率统计偏差。
  • 物化视图未设置增量刷新,导致统计结果过时,影响实时查询。
  • 外键列未加索引,导致关联查询慢(如外键列无索引,JOIN操作效率低)。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1