Yujun's Blog
什么是镜像字段?
什么是镜像字段?
最近在做一个抽奖项目需要存储用户抽奖记录的时候涉及到了这个概念,在这里记录一下学习心得。
具体来说,我们设计了三层账户结构设计,通过分表存储不同时间维度的数据,以更好地管理数据生命周期,提高查询效率,同时保留历史记录以便追溯和统计。
镜像字段(Mirror Fields)是在数据库设计中的一种特殊字段类型,在数据库或数据模型中添加一些冗余的字段,来支持某种功能或优化。用于在主表中存储关联表中的最新数据,以提高查询效率并减少跨表查询的需求。所以它是一种性能优化手段,避免了每次查询都需要关联多个表。镜像字段本质上是为了方便开发或优化而创建的“副本字段”。
在我们的项目中,镜像字段主要出现在raffle_activity_account
表(活动总账户表)中,具体表现为:
day_count_surplus
(日额度余额):镜像最新的日频流水表中的余额。month_count_surplus
(月额度余额):镜像最新的月频流水表中的余额。
通过在主表中存储最新的日/月额度余额,我们的系统系统可以在不查询日/月频流水表的情况下,快速获取用户当前的额度状态,在用户抽奖前进行额度检查时,可以直接查询主表,而不需要关联多个表。便于系统快速统计和报表生成。
代码实现
在代码实现中,镜像字段的更新主要发生在以下几种情况:
创建新的月/日账户记录时
当系统检测到用户在新的月份或新的日期首次参与活动时,会创建新的月/日账户记录,并同时更新主表中的镜像字段。即:INSERT + UPDATE
更新已有的月/日账户记录时
当用户在当前月份或当前日期继续参与活动时,系统会更新已有的月/日账户记录,并同步更新主表中的镜像字段。
库表设计
镜像字段设计与系统的分表策略密切相关。我们项目的账户额度管理采用了三层表结构:
- 活动账户表(
raffle_activity_account
):存储总体额度信息和镜像字段 - 月频库存流水表(
raffle_activity_account_month
):按月记录额度流水 - 日频库存流水表(
raffle_activity_account_day
):按日记录额度流水
举例
以用户参与抽奖活动为例,系统会执行以下步骤:
- 首先检查总账户额度(使用镜像字段快速判断)。
- 如果总额度足够,再检查月账户和日账户。
- 在更新账户额度时,系统会在事务中同时更新三个表,并保持镜像字段的一致性。
为了保证数据的一致性和可追溯性,我们必须设计这三张表,那么此时必然会涉及到查询的时候连表查询的问题,通过在总活动账户表中设计镜像字段,我们巧妙的解决了这个问题,减少跨表查询,提高查询效率。之后这里更新三个表的操作是在抽奖完成之后,自然也可以异步执行来提高性能。