最近开发遇到一个值得讨论的问题,总结如下,可发表下具体的看法,一起学习进步。
背景
规则1:活动服务(简称MBC)中活动表(简称promotion)大致信息如下:ID、商品ID、参与活动的数量、其他信息,如下表所示
属性 | 意义 |
---|---|
id | 主键 |
good_id | 商品唯一ID |
exchange_num | 参与活动的数量 |
…… | … |
规则2:商品服务(简称SSC)提供商品的基本的信息表(简称item)如下:
属性 | 意义 |
---|---|
id | 商品主键,对应MBC表good_id |
good_name | 商品名称 |
total_num | 库存 |
…… | … |
规则3:SSC中的商品名称可编辑
需求:MBC以商品名称(good_name)进行模糊查询,返回以分页显示的积分活动列表(包括good_name、exchange_num)
思考
以商品名称进行搜索,直观的想法有两种
- good_name冗余到promotion表中,若业务不允许修改正在参与活动的商品名称这样做比较合适,若业务允许修改,SSC可做一些同步机制
- 搜索时根据good_id关联item表,获取good_name,需要考虑接口性能
于是有了下面的方案,方案中的想法只做参考,具体选用哪一种需要根据业务场景
方案
1. 活动表冗余商品名称(promotion表中增加good_name字段),且不允许修改参与活动的商品的名称
做法:可以从promotion表直接分页查询,满足要求。SSC需要定制字段锁,保证该商品正在参与活动就不允许修改商品的名称,直至活动失效,便释放商品字段锁
优点:活动记录表冗余商品名称,查询不需要跨其他服务,性能高
缺点:活动期间,参与活动的商品不能编辑商品的名称,同时SSC需要维护字段锁
2. 活动表冗余商品名称(promotion表中增加good_name字段),允许修改参与活动的商品的名称
做法:可以从promotion表直接分页查询,满足要求。SSC中参与活动的商品一旦修改活动名称,需要把活动名称同步到promotion表中(如以MQ方式)
优点:活动记录表冗余商品名称,查询不需要跨其他服务,性能高,且可获取最新的商品名称
缺点:活动期间,参与活动的商品名称一旦修改,就需要同步给MBC,增加了系统复杂性
3. 活动表不冗余商品名称,允许修改参与活动的商品的名称
以下两种做法取决于具体的业务场景,若活动表量级小可采取做法一,若商品表量级小可采取做法二
做法一:以搜索商品名称为例,如”鸡腿“,首先从promotion表中查询出所有参与活动的good_id列表,然后用good_id列表和“鸡腿”关键字从商品服务中查出pagesize条,返回。
优点:商品和优惠券服务做额外功,可编辑商品名称
缺点:搜索性能很低,针对活动表量级小
做法二:以搜索商品名称为例,如”鸡腿“,首先从商品服务中查出所有匹配”鸡腿“的商品,并从中获取good_id列表,然后去活动记录表一一匹配,匹配出pagesize条,返回。
优点:商品和优惠券服务做额外功,可编辑商品名称
缺点:搜索性能很低,针对商品表量级小