
1) 【一句话结论】采用混合数据库架构,结合关系型数据库(MySQL)存储结构化数据、时序数据库(InfluxDB)处理物流轨迹时序数据,区块链(Hyperledger Fabric)保证关键数据不可篡改,通过消息队列(Kafka)实现跨数据库事务同步,并设计索引与事务机制保障性能与数据一致性。
2) 【原理/概念讲解】老师口吻解释关键概念:
3) 【对比与适用场景】
| 数据库类型 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 关系型数据库(MySQL) | 基于关系模型,数据以表存储 | ACID事务,支持复杂查询(JOIN),数据结构化 | 农户信息、种植记录、检测报告等结构化数据(需关联查询) | 写入性能一般(单表写入约1-10万QPS),不适合海量时序数据 |
| 时序数据库(InfluxDB) | 专为时间序列数据设计 | 高写入吞吐量(百万级/秒),时间范围查询优化,数据压缩(Zstd) | 物流轨迹中的温度、湿度等时序数据(高频、时间序列) | 不支持复杂关联,需与关系型数据库关联(如通过产品ID关联) |
| 区块链(Hyperledger Fabric) | 分布式账本,数据以区块存储 | 不可篡改,去中心化,智能合约 | 关键数据(检测报告、种植记录)的不可篡改验证(如检测报告哈希值上链) | 交易延迟(PBFT共识约100-200ms延迟),适合小批量、高安全数据(如检测报告) |
4) 【示例】
CREATE TABLE farmer (
id UUID PRIMARY KEY,
name VARCHAR(100),
phone VARCHAR(20) ENCRYPTED,
address VARCHAR(200) ENCRYPTED,
planting_count INT DEFAULT 0
);
CREATE TABLE planting_record (
id UUID PRIMARY KEY,
farmer_id UUID REFERENCES farmer(id),
seed_time DATETIME,
fertilizer_amount FLOAT,
harvest_time DATETIME,
FOREIGN KEY (farmer_id) REFERENCES farmer(id)
);
CREATE TABLE logistics_trace (
id UUID PRIMARY KEY,
product_id UUID REFERENCES product(id),
vehicle_id VARCHAR(20),
temperature FLOAT,
humidity FLOAT,
timestamp DATETIME,
FOREIGN KEY (product_id) REFERENCES product(id)
);
CREATE TABLE inspection_report (
id UUID PRIMARY KEY,
product_id UUID REFERENCES product(id),
inspection_time DATETIME,
pesticide_content FLOAT,
result VARCHAR(20),
hash_value VARCHAR(64) UNIQUE -- 存哈希值(SHA-256)
);
CREATE TABLE product (
barcode VARCHAR(20) PRIMARY KEY,
product_id UUID PRIMARY KEY,
farmer_id UUID REFERENCES farmer(id),
planting_record_id UUID REFERENCES planting_record(id),
inspection_report_id UUID REFERENCES inspection_report(id)
);
with db.transaction():
db.execute("INSERT INTO planting_record (farmer_id, seed_time, fertilizer_amount) VALUES (?, ?, ?)",
(farmer_id, seed_time, fertilizer_amount))
db.execute("UPDATE farmer SET planting_count = planting_count + 1 WHERE id = ?", farmer_id)
kafka_producer.send("planting_record_sync",
value={"record_id": planting_record_id, "farmer_id": farmer_id})
INSERT INTO inspection_report (product_id, inspection_time, pesticide_content, result, hash_value)
VALUES (?, ?, ?, ?, SHA2(CONCAT(?, ?, ?, ?), 256))
blockchain_client.add_transaction({
"product_id": product_id,
"hash_value": hash_value,
"timestamp": inspection_time
})
5) 【面试口播版答案】设计农产品溯源系统,核心是混合数据库架构。用MySQL存结构化数据(农户、种植记录),因为需要关联查询(如通过农户ID关联种植记录);用InfluxDB存物流温度等时序数据,因为数据有时间序列,高频写入(如每秒记录温度);用Hyperledger Fabric区块链保证关键数据(检测报告、种植记录)不可篡改,比如检测报告的哈希值上链。跨数据库事务用Kafka消息队列,种植记录写入MySQL后,通过消息触发区块链节点上链,确保数据最终一致。索引方面,为快速查条码,在产品表建唯一索引(barcode),种植记录、物流轨迹表用产品ID+时间戳的复合索引。事务处理用行级锁,比如插入种植记录时,同时更新农户种植次数,事务保证原子性,避免高并发下数据不一致。检测报告存哈希值,若报告有误则重新生成哈希并更新区块链,保证不可篡改。农户敏感信息脱敏加密,保护隐私。
6) 【追问清单】
7) 【常见坑/雷区】