系统设计 - 指标累加

电商营销系统中有许多需要累加计数的功能,如商品、活动、用户参与活动次数、商品参与次数等。这些都是属于完成某个任务需要计数的范畴!而商品、活动、用户、时间等又可以组合,以满足各种业务需求!

常规的如活动总次数、活动每日次数,商品库存数、参与活动商品库存数、每天参与活动商品库存数,用户参与活动次数、用户每天参与活动次数、用户参与活动商品次数、用户每天参与活动商品总次数等。这些还只是在活动、用户、时间、商品,4个维度,如果再增加个按门店维度,就会有5个维度。按理说,维度是可以一直增加,怎么样设计一个能够支撑的系统了?

在梳理这些逻辑时,找出一个规律就是这些所有计数的东西,都是围绕着人来的。

活动总次数:所有人能够参与这个活动的总数

商品库存数:所有人能够购买的的商品总数

每天参与活动商品库存数:所有人在1天的时间能够购买的商品总数

用户参与活动次数:1个用户参与这个活动的总次数

用户每天参与活动次数:1个用户参与这个活动1天的总次数

用户参与活动商品次数:1个用户购买商品的总次数

用户每天参与活动商品次数:1个用户购买商品1天的总次数

如再再加一个门店维度

活动门店总次数:所有人能够在这个门店参与活动的总次数

活动门店每日总次数:所有人能够在这个门店1天的活动总次数

以上这些是按用户维度来归类,就会有2种

所有人共享的变量

  1. 库存是共享变量
  2. 活动总次数是共享变量

个人的不同维度变量

  1. 每人参与活动次数
  2. 每人购买商品份数
  3. 每人按时间参与活动
  4. 每人按时间购买份数
  5. 每人在指定门店参与活动次数
  6. 每人在指定门店按时间参与活动次数

有了这层思考后,整个系统的设计将会非常简单了,总体设计就是2个领域

共享指标领域和用户指标领域

共享指标:

{
  "toolId": 133,                                活动id
  "userQuota": 2,                               所有用户参与总次数
  "userQuotaUse": 1,                        
  "userDayToolQuota": [
      {
          "userQuota": 1,                       所有用户在7月15日参与总次数
          "userQuotaUse": 0,
          "day": "2025-07-15"                   日期
      },
      {
          "userQuota": 1,                       所有用户在7月16日参与总次数
          "userQuotaUse": 0,
          "day": "2025-07-16"                   日期
      }
  ],
  "skuSnQuota": [
      {
          "id": "000004100",                    商品ID
          "skuSnQuota": 23,                     商品总使用份数
          "skuSnQuotaUse": 0
      }
  ],
  "skuSnDayToolQuota":[
      {
          "id": "000004100",                    商品ID
          "skuSnQuota": 23,                     商品在7月15日总使用份数
          "skuSnQuotaUse": 0,
          "day":"2025-07-15"                    日期
      },
      {
          "id": "000004101",                    商品ID
          "skuSnQuota": 23,                     商品在7月16日总使用份数
          "skuSnQuotaUse": 0,
          "day": "2025-07-15"                   日期
      }
    ]
}

用户指标:

{
    "toolId": 141,
    "userQuota": 0,                          当前用户参与这个活动总次数
    "userQuotaUse": 0,
    "userDayToolQuota": [
        {
            "userQuota": 1,                  当前用户在7月15日参与活动总次数
            "userQuotaUse": 0,
            "day": "2025-07-15"              日期
        },
        {
            "userQuota": 1,                  当前用户在7月16日参与活动总次数
            "userQuotaUse": 0,
            "day": "2025-07-16"              日期
        }
    ],
    "userSkuSnQuota": [
        {
            "id": "000004100",              商品唯一ID
            "skuSnQuota": 1,                用户购买这个商品的总份数
            "skuSnQuotaUse": 1,           
            "userQuota": 1,                 用户购买这个商品的总次数
            "userQuotaUse": 1
        }
    ],
    "userSkuSnDayQuota": [
        {
            "id": "000004101",             商品唯一ID
            "day": "2025-07-21",           日期
            "userQuota": 1,                用户在7月21日购买这个商品的总次数
            "userQuotaUse": 1,
            "skuSnQuota": 1,
            "skuSnQuotaUse": 1             用户在7月21日购买这个商品的总份数
        }
    ]
}

注意其中的次数与份数,用户维度指次数,商品维度指份数。区分这个原因是需求可以要求设定按次数限制和份数据限制。

如果需要再加维度,比如上面提到的再细划到指定商铺维度!

那么共享指标设计:

{
  "toolId": 133,                                活动id
  "userQuota": 2,                               所有用户参与总次数
  "userQuotaUse": 1,    
  "userStoreQuota": [
      {
          "storeId": 123456,                    店铺ID
          "userQuota": 1,                       所有用户在这个店铺参与总次数
          "userQuotaUse": 0
      },
      {
          "storeId": 654321,                    店铺ID
          "userQuota": 1,                       所有用户在这个店铺参与总次数
          "userQuotaUse": 0
      }
  ],
  "userStoreDayQuota": [
      {
          "storeId": 123456,                    店铺ID
          "userQuota": 1,                       所有用户在这个店于7月15日参与总次数
          "userQuotaUse": 0,
          "day": "2025-07-15"                   日期
      },
      {
          "storeId": 123456,                    所有用户在这个店于7月16日参与总次数
          "userQuota": 1,                       所有用户在7月16日参与总次数
          "userQuotaUse": 0,
          "day": "2025-07-16"                   日期
      }
  ]
}

而用户指标的设计以此类推。

在这个设计中,只有共享指标更新时存在并发抢锁问题,只要在更新的地方做好并发控制。而用户指标因为是在用户维度,不会存在并发问题。

好的设计可以减少系统复杂度,也能减轻开发难度。

毛选开篇就说谁是我们的朋友、谁是我们的敌人,这是革命首要搞明白的问题!而设计指标计数系统首要搞明白的是哪些是共享指标计数,哪些是用户指标计数!有了这个基调再去思考指标系统就非常简单明白了。

posted @ 2025-07-21 17:01  wxwall  阅读(17)  评论(0)    收藏  举报