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

设计一个用于存储猪只生长数据的数据库表结构,需要支持快速查询某只猪在不同时间点的体重、料肉比等数据,请说明表结构设计思路。

牧原管培生难度:中等

答案

1) 【一句话结论】:为存储猪只生长数据并支持快速查询,设计包含“猪只主表”(存储静态基础信息)与“生长记录表”(存储时间序列动态数据)的数据库结构,通过外键关联确保数据一致性,并为关键字段(猪只ID、时间戳)建立索引,以优化查询效率。

2) 【原理/概念讲解】:老师会解释,数据库表设计需平衡数据关联与查询效率。猪只的基础信息(耳标号、采购批次等)属于静态数据,存储在主表(如pig_info),主键为唯一标识(耳标号),保证每只猪唯一。生长数据(体重、料肉比)随时间变化,属于动态时间序列数据,存储在记录表(如growth_record),通过外键pig_id关联主表。时间戳字段(record_time)标记数据采集时间,是查询特定时间点数据的核心。索引方面,主键(pig_id)和记录表的时间戳索引(record_time)是优化查询的关键,因为查询某只猪在特定时间点的数据,需先通过pig_id快速定位记录,再通过时间戳索引过滤时间范围。

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

设计方案定义特性使用场景注意点
单表存储所有猪只信息(基础+生长数据)存于一个表表结构复杂,字段多,数据冗余数据量小,查询简单场景查询效率低,数据更新复杂
主表+记录表(分表存储)主表存储静态信息,记录表存储时间序列数据结构清晰,数据分离,查询高效大规模时间序列数据,频繁查询需维护外键关系,索引设计关键

4) 【示例】:伪代码示例。

-- 猪只主表
CREATE TABLE pig_info (
    pig_id INT PRIMARY KEY,          -- 猪只唯一标识(耳标号)
    ear_tag VARCHAR(20) UNIQUE,      -- 耳标号(唯一标识)
    purchase_batch VARCHAR(50),      -- 采购批次
    birth_date DATE,                 -- 出生日期
    sex CHAR(1)                      -- 性别(M/F)
);

-- 生长记录表(时间序列表)
CREATE TABLE growth_record (
    record_id INT PRIMARY KEY,       -- 记录唯一标识
    pig_id INT,                      -- 外键,关联pig_info表的pig_id
    record_time TIMESTAMP NOT NULL,  -- 数据采集时间(时间戳,作为主键的一部分)
    weight DECIMAL(8,2),             -- 体重(kg)
    feed_to_meat_ratio DECIMAL(4,2), -- 料肉比(kg饲料/kg肉)
    feed_consumption DECIMAL(8,2),   -- 饲料消耗量(kg)
    FOREIGN KEY (pig_id) REFERENCES pig_info(pig_id)  -- 外键约束
);

-- 索引优化查询
CREATE INDEX idx_pig_id ON growth_record(pig_id);
CREATE INDEX idx_record_time ON growth_record(record_time);

5) 【面试口播版答案】:(约90秒)
“面试官您好,针对存储猪只生长数据并支持快速查询不同时间点数据的需求,我的设计思路是采用主表(猪只基础信息表)与时间序列记录表结合的方式。首先,猪只的基础信息(如耳标号、采购批次、出生日期等)属于静态数据,存储在pig_info表中,主键为猪只唯一标识(耳标号),确保每只猪唯一。然后,生长数据(体重、料肉比等)随时间变化,属于动态时间序列数据,存储在growth_record表中,通过外键pig_id关联主表,记录每只猪在不同时间点的数据。关键点在于时间戳字段record_time,它用于标记数据采集时间,是查询特定时间点数据的核心。同时,为pig_id和record_time字段建立索引,比如idx_pig_id和idx_record_time,这样查询某只猪在某个时间段的生长数据时,可以通过pig_id快速定位记录,再通过时间戳索引过滤时间范围,大幅提升查询效率。这种设计既保证了数据的一致性(通过外键约束),又优化了查询性能,适合大规模时间序列数据的存储和查询。”

6) 【追问清单】:

  • 问:如何处理数据更新(比如某只猪的体重数据需要修改)?
    回答要点:通过record_id或pig_id+record_time唯一标识记录,更新时更新对应记录的weight等字段,外键约束保证关联正确。
  • 问:如果数据量很大(比如每天每只猪记录多次),如何优化性能?
    回答要点:考虑对记录表按时间或批次进行分区,或者使用时间序列数据库(如InfluxDB),但结合关系型数据库的话,优化索引和分区。
  • 问:如何保证数据一致性,比如避免重复记录?
    回答要点:主键唯一性约束(record_id或pig_id+record_time),外键约束关联主表,插入时检查耳标号是否已存在,避免重复插入。
  • 问:如果需要查询某只猪从出生到现在的生长曲线,如何设计查询?
    回答要点:使用WHERE pig_id = ? AND record_time BETWEEN ? AND ?,结合ORDER BY record_time获取时间序列数据。
  • 问:表结构中是否需要考虑其他字段,比如饲料类型?
    回答要点:可以扩展growth_record表,增加feed_type字段,记录饲料类型,但需评估字段冗余,避免表过大影响性能。

7) 【常见坑/雷区】:

  • 坑1:未设置时间戳字段,导致无法区分不同时间点的数据,查询时无法过滤时间范围。
  • 坑2:未建立外键关联,导致数据不一致,比如修改猪只信息时,生长记录表中的pig_id未同步更新。
  • 坑3:表结构过于复杂,包含过多字段,导致查询时需要扫描大量数据,影响性能。
  • 坑4:未考虑数据分区,当数据量巨大时,全表扫描效率低。
  • 坑5:主键设计不当,比如用自增ID作为主键,但查询时需要通过耳标号关联,导致关联效率低。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1