
1) 【一句话结论】为满足人邮社数字出版业务的海量元数据与用户行为数据存储需求,采用关系型数据库(如MySQL),设计元数据表(以ISBN为主键,JSONB存储扩展信息)和用户行为表(按行为时间分区分表,主键含分区时间),通过读写分离、Redis缓存热门元数据、分布式事务(SAGA模式,含补偿机制)及AES-256加密(密钥管理)保证数据一致性与安全性。
2) 【原理/概念讲解】首先,元数据表存储图书标准化信息,主键为ISBN(唯一标识),字段包括作者、出版社、版权文本等,添加JSONB字段存储封面URL等非结构化信息,以应对未来扩展。用户行为表记录用户操作(阅读、购买等),为应对高并发写入,按行为时间(如按天)分区分表(如user_actions_202401),主键为action_id + 分区时间,外键关联元数据表ISBN。数据一致性通过事务(如购买时同时更新库存,原子操作)和分布式事务(SAGA模式:购买成功后发送消息到库存更新,失败则回滚,补偿事务确保最终一致性)保障。安全性方面,设置数据库用户权限(只读用户访问元数据表,操作用户行为表的用户有写权限),对敏感字段(如版权文本、用户ID)使用AES-256加密存储,配置数据库审计日志记录所有修改操作。类比:元数据表像图书的“身份证”,用户行为表按时间切片存储,就像日志按天归档,事务就像一次性完成“买书”动作,消息队列缓冲就像缓冲区,防止写入压力过大;Redis缓存热门元数据,减少数据库查询压力。
3) 【对比与适用场景】
| 方面 | 关系型数据库(如MySQL) | 非关系型数据库(如MongoDB) |
|---|---|---|
| 定义 | 结构化数据,表、行、列,支持ACID | 非结构化/半结构化,文档、键值等 |
| 特性 | 强一致性,事务支持,外键约束,支持读写分离 | 高扩展性,灵活Schema,弱一致性,无外键 |
| 使用场景 | 元数据(结构化,需关联,事务,如ISBN关联行为) | 用户行为日志(灵活字段,高写入,如按用户统计) |
| 注意点 | 分表分库复杂,事务开销大,需优化索引 | 无外键,数据一致性需业务层保证,写入性能高但读复杂 |
4) 【示例】
元数据表(books):
CREATE TABLE books (
isbn VARCHAR(13) PRIMARY KEY,
author VARCHAR(100) NOT NULL,
publisher VARCHAR(100),
copyright TEXT,
metadata JSONB, -- 存储扩展信息,如封面URL、描述
UNIQUE (isbn)
);
用户行为表(按时间分区,示例分区为202401):
CREATE TABLE user_actions_202401 (
action_id BIGINT AUTO_INCREMENT PRIMARY KEY,
user_id BIGINT NOT NULL,
action_type ENUM('read', 'purchase', 'favorite') NOT NULL,
action_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
book_isbn VARCHAR(13) NOT NULL,
FOREIGN KEY (book_isbn) REFERENCES books(isbn),
INDEX idx_user_action (user_id, action_time) -- 提高按用户查询性能
);
分布式事务(SAGA模式,购买失败补偿):
-- 1. 用户购买请求入队列(Kafka)
{
"user_id": 1001,
"book_isbn": "9787115428961",
"action_type": "purchase",
"timestamp": "2024-01-15 10:30:00"
}
-- 2. 消费者处理购买消息
START TRANSACTION;
INSERT INTO user_actions_202401 (user_id, action_type, book_isbn) VALUES (1001, 'purchase', '9787115428961');
UPDATE inventory SET stock = stock - 1 WHERE book_isbn = '9787115428961' AND stock > 0;
COMMIT;
-- 3. 补偿事务(若库存不足或失败)
START TRANSACTION;
-- 恢复库存(假设库存表inventory)
UPDATE inventory SET stock = stock + 1 WHERE book_isbn = '9787115428961';
-- 删除用户行为记录(可选,根据业务)
DELETE FROM user_actions_202401 WHERE action_id = ?;
COMMIT;
Redis缓存热门元数据(示例):
// Redis缓存热门图书元数据(假设缓存键为"book:isbn:metadata")
{
"isbn": "9787115428961",
"author": "作者A",
"publisher": "人民邮电出版社",
"cover_url": "https://example.com/cover.jpg",
"description": "书籍描述"
}
5) 【面试口播版答案】面试官您好,针对人邮社数字出版业务的海量元数据和用户行为数据,我设计如下数据库方案。首先,元数据表以ISBN为主键,存储图书的作者、出版社、版权等,为适应未来扩展,添加JSONB字段存储封面URL等扩展信息。用户行为表按时间分区(如按天)分表,记录用户ID、行为类型、关联的ISBN,通过外键关联元数据表。为保证高并发下的数据一致性,采用事务机制(如购买时同时更新库存,确保原子性),并按时间分区分表提高写入性能;通过读写分离(主库写,从库读)缓解读压力。安全性方面,设置不同数据库用户权限(只读用户访问元数据表,操作用户行为表的用户有写权限),对敏感字段(如版权文本、用户ID)使用AES-256加密存储,配置数据库审计日志记录所有修改操作。同时,为优化查询性能,用Redis缓存热门图书元数据,减少数据库查询压力;采用分布式事务(SAGA模式),通过消息队列和补偿机制确保最终一致性。这样既能高效存储海量数据,又能保证数据一致性和安全性。
6) 【追问清单】
7) 【常见坑/雷区】