4. 数据模型设计:评分事件模型、用户模型、商品/内容模型、聚合结果模型
实时评分系统的核心在于对海量、高并发的评分事件进行快速处理与准确聚合。数据模型的设计直接决定了系统的吞吐能力、数据一致性以及后续分析的灵活性。本章将详细定义四个核心数据模型:评分事件模型、用户模型、商品/内容模型以及聚合结果模型。
4.1 评分事件模型(Rating Event Model)
评分事件是系统的原始输入,代表一次独立的用户评分行为。该模型需要承载完整的上下文信息,以便进行去重、反欺诈以及实时流处理。
| 字段名 | 类型 | 描述 | 示例 |
|---|---|---|---|
event_id |
UUID | 全局唯一事件ID,用于幂等去重 | a1b2c3d4-...-e5f6 |
user_id |
String | 评分用户标识 | user_10086 |
target_id |
String | 被评分对象ID(商品/内容) | product_9527 |
target_type |
Enum | 对象类型(product / content) | product |
score |
Integer | 评分值(1-5分) | 4 |
timestamp |
Long | 事件发生时间戳(毫秒) | 1712345678000 |
metadata |
Map | 扩展属性(设备、渠道、标签等) | {"device":"iOS","channel":"app"} |
设计要点:使用
event_id 实现幂等写入,避免消息队列重试导致重复评分。 target_type 字段支持多业务线复用同一套评分管道。
4.2 用户模型(User Model)
用户模型不仅存储基础信息,还需记录用户的评分行为特征,用于风控与个性化推荐。
- 基础信息:
user_id、nickname、avatar_url、registration_time。 - 评分统计:
total_ratings(总评分次数)、avg_score_given(平均给出分数)、last_rating_time(最近评分时间)。 - 风控标签:
risk_level(风险等级)、is_blacklisted(是否黑名单)、daily_rating_count(当日评分次数)。
关键约束:用户模型中的
daily_rating_count 需要在内存中(如 Redis)实时更新,并与数据库异步同步,用于拦截刷分行为。
4.3 商品/内容模型(Product/Content Model)
该模型描述被评分对象的元数据,是聚合查询的维度基础。商品和内容可共用一套抽象模型,通过 type 字段区分。
| 字段名 | 类型 | 描述 | 示例 |
|---|---|---|---|
target_id |
String | 对象唯一ID | product_9527 |
type |
Enum | 对象类型 | product |
title |
String | 对象标题 | 无线蓝牙耳机 |
category_id |
String | 所属分类ID | cat_elec_audio |
seller_id |
String | 卖家/创作者ID | seller_123 |
status |
Enum | 上下架状态 | online |
4.4 聚合结果模型(Aggregation Result Model)
聚合结果模型是实时计算产出的最终数据,直接服务于前端展示与推荐系统。该模型需要支持高并发读取,通常存储在 Redis 或具备缓存层的数据库中。
// 聚合结果模型 JSON 示例
{
"target_id": "product_9527",
"target_type": "product",
"total_ratings": 1580,
"average_score": 4.2,
"score_distribution": {
"1": 20,
"2": 45,
"3": 210,
"4": 680,
"5": 625
},
"recent_trend": {
"last_hour_avg": 4.5,
"last_24h_avg": 4.1
},
"last_updated": 1712345678000
}
注意:
score_distribution 字段用于前端展示评分柱状图,必须保证各分数段计数之和等于 total_ratings。 recent_trend 用于计算近期热度,需通过滑动窗口算法实时更新。
4.5 数据模型关系与流转架构
下图展示了四个模型之间的数据流转关系:评分事件经过流处理引擎后,更新用户模型与商品模型,最终产出聚合结果模型供 API 层查询。
4.6 模型设计核心原则总结
| 模型 | 存储选型 | 核心设计原则 |
|---|---|---|
| 评分事件模型 | Kafka / Pulsar | 不可变、有序、支持回溯重放 |
| 用户模型 | Redis + MySQL | 热数据在缓存,冷数据持久化 |
| 商品/内容模型 | MySQL + CDN | 维度表,变化频率低,可缓存 |
| 聚合结果模型 | Redis Cluster | 高并发读,最终一致性,TTL 过期 |
架构决策:评分事件模型采用不可变日志结构,确保数据完整性;聚合结果模型采用最终一致性,允许秒级延迟,换取极高的查询吞吐量。