一、系统设计目标
1. 完整记录商品全生命周期的变更历史
2. 支持商品信息的版本对比和回滚
3. 提供审计追踪能力,满足合规要求
4. 支持多维度查询和分析商品迭代趋势
二、核心功能模块
1. 商品变更记录模块
- 变更类型定义:
- 基础信息变更(名称、描述、分类等)
- 价格变更(原价、促销价、会员价)
- 库存变更(总库存、区域库存)
- 上下架状态变更
- 图片/视频等多媒体变更
- 规格/属性变更
- 数据结构设计:
```json
{
"change_id": "字符串ID",
"item_id": "商品ID",
"change_type": "变更类型枚举",
"operator": "操作人ID",
"operator_type": "系统/人工",
"change_time": "时间戳",
"before_snapshot": "变更前快照",
"after_snapshot": "变更后快照",
"change_details": [
{
"field": "price",
"old_value": 29.9,
"new_value": 19.9,
"change_reason": "促销活动"
}
],
"related_orders": ["关联订单ID数组"],
"ip_address": "操作IP"
}
```
2. 版本控制模块
- 版本快照机制:
- 每次重大变更生成完整快照
- 支持按版本号回滚
- 版本差异对比工具
- 版本号生成策略:
```
主版本号.次版本号.修订号 (如 1.2.5)
- 主版本号:重大架构变更
- 次版本号:功能新增/删除
- 修订号:小范围修改/修复
```
3. 查询与分析模块
- 多维查询能力:
- 按商品ID查询变更历史
- 按时间范围筛选
- 按变更类型过滤
- 按操作人筛选
- 数据分析功能:
- 变更频率统计
- 价格波动分析
- 上下架时间分布
- 变更原因分类统计
三、技术实现方案
1. 数据存储方案
- 主表设计:
```sql
CREATE TABLE item_change_log (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
item_id VARCHAR(32) NOT NULL,
change_type ENUM(CREATE,UPDATE,DELETE,STATUS_CHANGE,PRICE_CHANGE) NOT NULL,
operator_id VARCHAR(32),
operator_type ENUM(SYSTEM,ADMIN,MERCHANT) NOT NULL,
change_time DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
before_snapshot TEXT,
after_snapshot TEXT,
change_reason VARCHAR(500),
INDEX idx_item_id (item_id),
INDEX idx_change_time (change_time)
);
```
- 变更详情表:
```sql
CREATE TABLE item_change_detail (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
change_log_id BIGINT NOT NULL,
field_name VARCHAR(50) NOT NULL,
old_value TEXT,
new_value TEXT,
data_type ENUM(STRING,NUMBER,BOOLEAN,JSON) NOT NULL,
FOREIGN KEY (change_log_id) REFERENCES item_change_log(id)
);
```
2. 关键实现代码
变更记录拦截器(Spring AOP示例)
```java
@Aspect
@Component
public class ItemChangeAspect {
@Autowired
private ItemChangeLogService changeLogService;
@AfterReturning(
pointcut = "execution(* com.meituan.buyer.service.ItemService.update*(..)) && args(item,..)",
returning = "result"
)
public void afterItemUpdate(JoinPoint joinPoint, Item item, Object result) {
// 获取操作人信息
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
// 获取变更前数据(可从缓存或数据库获取)
Item oldItem = itemCacheService.getById(item.getId());
// 生成变更记录
ItemChangeLog log = new ItemChangeLog();
log.setItemId(item.getId());
log.setChangeType(determineChangeType(joinPoint));
log.setOperatorId(authentication.getName());
log.setBeforeSnapshot(JSON.toJSONString(oldItem));
log.setAfterSnapshot(JSON.toJSONString(item));
log.setChangeReason("手动修改商品信息");
// 保存变更记录
changeLogService.save(log);
}
private ChangeType determineChangeType(JoinPoint joinPoint) {
// 根据方法名确定变更类型
String methodName = joinPoint.getSignature().getName();
if (methodName.contains("Price")) {
return ChangeType.PRICE_CHANGE;
}
// 其他类型判断...
return ChangeType.UPDATE;
}
}
```
版本回滚实现
```java
@Service
public class ItemVersionService {
@Autowired
private ItemRepository itemRepository;
@Autowired
private ItemChangeLogRepository changeLogRepository;
@Transactional
public Item rollbackToVersion(String itemId, Long versionId) {
// 获取指定版本记录
ItemChangeLog log = changeLogRepository.findById(versionId)
.orElseThrow(() -> new RuntimeException("版本不存在"));
if (!log.getItemId().equals(itemId)) {
throw new RuntimeException("版本与商品不匹配");
}
// 从快照恢复商品数据
Item restoredItem = JSON.parseObject(log.getBeforeSnapshot(), Item.class);
// 保存恢复后的商品
Item savedItem = itemRepository.save(restoredItem);
// 创建回滚记录
ItemChangeLog rollbackLog = new ItemChangeLog();
rollbackLog.setItemId(itemId);
rollbackLog.setChangeType(ChangeType.ROLLBACK);
rollbackLog.setOperatorId("system");
rollbackLog.setBeforeSnapshot(JSON.toJSONString(itemRepository.findById(itemId).orElse(null)));
rollbackLog.setAfterSnapshot(JSON.toJSONString(savedItem));
rollbackLog.setChangeReason("回滚到版本ID: " + versionId);
changeLogRepository.save(rollbackLog);
return savedItem;
}
}
```
四、系统优化方案
1. 性能优化:
- 对变更记录表进行分区(按时间或商品ID)
- 使用异步方式记录非关键变更
- 对大字段(如快照)使用单独存储
2. 存储优化:
- 定期归档历史数据到冷存储
- 对快照数据进行压缩存储
- 实现增量快照机制
3. 查询优化:
- 构建变更记录的搜索引擎(Elasticsearch)
- 实现物化视图加速常用查询
- 添加缓存层缓存热点商品变更记录
五、部署与监控
1. 部署方案:
- 独立数据库实例存储变更记录
- 与主业务数据库同机房部署保证低延迟
- 跨机房同步保证数据安全
2. 监控指标:
- 变更记录写入延迟
- 查询响应时间
- 存储空间使用率
- 异常变更检测(如频繁价格变动)
3. 告警策略:
- 写入失败率超过阈值
- 存储空间不足预警
- 异常变更模式检测
六、合规与安全
1. 数据保留策略:
- 遵循《电子商务法》等法规要求
- 默认保留3年变更记录
- 支持法律合规的长期保留需求
2. 访问控制:
- 变更记录查询权限分级管理
- 操作日志完整记录查询行为
- 敏感变更需要二次授权
3. 数据加密:
- 传输过程使用TLS加密
- 存储敏感信息加密处理
- 定期轮换加密密钥
七、扩展功能建议
1. 变更影响分析:
- 分析价格变更对销量的影响
- 跟踪上下架对流量的影响
- 评估商品信息优化效果
2. 智能预警:
- 异常价格变动检测
- 频繁变更商品预警
- 违规内容变更拦截
3. 可视化看板:
- 商品变更趋势图
- 变更类型分布
- 操作人活跃度分析
该方案实现了美团买菜系统商品全生命周期的完整记录,既满足了业务运营需求,也符合合规审计要求,同时通过技术优化保证了系统性能。