需求分析

初级需求分析:

  1. 商品加入购物车
  2. 查看购物车列表
  3. 发起结算下单

用户体验需求分析:

  1. 用户未登录,浏览器中加购商品,登录后是否保留?
  2. 用户未登录,浏览器中加购商品,关闭再打开浏览器后是否保留?
  3. 用户登录,关闭再打开浏览器,是否保留?

主要属性

购物车系统,只有一个实体 —— 购物车,购物车里为一个个待下单的选项。

每一个选项包含:商品 SKUID、加入购物车时间、数目、勾选状态。

需求实现设计

暂存购物车

如果需要实现“暂存购物车”,即用户没有登录时的加购的商品。

首先分析存储位置,服务端肯定不合适,无法知道合适删除“暂存购物车”,导致数据激增。那么只能是客户端存储,客户端合适的方案有:Cookie 和 LocalStorage 存储。

Cookie 存储的优点:每次与服务端交互都会携带,和购物车交互逻辑可以在服务端完成(加购、删除商品)并且实现很简单。

Cookie 存储的缺点:Cookie 只能存储 4KB 数据,对于商品种类数量较多的平台,有可能导致超出存储上限。

LocalStorage 存储的优点:存储容量比 Cookie 的 4KB 上限大得多,而且不用每次请求都要带着,可节省带宽。

LocalStorage 存储的缺点:实现复杂,客户端和服务端都要实现业务逻辑。

存储的时候,直接一个 JSON 按照“主要属性”中的存储就可以。

用户购物车

CREATE TABLE shopping_cart (
    id BIGINT AUTO_INCREMENT PRIMARY KEY NOT NULL COMMENT '自增主键',
    user_id BIGINT NOT NULL COMMENT '用户 ID',
    sku_id BIGINT NOT NULL COMMENT '商品 ID',
    count INT NOT NULL COMMENT '商品数量',
    timestamp DATE NOT NULL COMMENT '加购时间',
    selected TINYINT(1) COMMENT '购选状态',
    INDEX idx_user_id (user_id)
);

user_id 上增加索引,是因为查询购物车状态都是以 user_id 为基础的。

也可以使用 Redis 来保存购物车信息,用户 ID=Key,Redis 的 HASH=Value,保存购物车中的商品。

至于是否需要 Redis,需要根据存储/开发/维护成本、性能、数据一致性等角度去思考。