
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等字段,外键约束保证关联正确。record_id或pig_id+record_time),外键约束关联主表,插入时检查耳标号是否已存在,避免重复插入。WHERE pig_id = ? AND record_time BETWEEN ? AND ?,结合ORDER BY record_time获取时间序列数据。growth_record表,增加feed_type字段,记录饲料类型,但需评估字段冗余,避免表过大影响性能。7) 【常见坑/雷区】:
pig_id未同步更新。