购物车表需用user_key统一标识用户并建索引,存储sku_id而非goods_id,冗余goods_id便于统计,spec_info存JSON规格信息,quantity限制最大值,status支持软删除,联合唯一索引uk_user_sku防止重复,定时清理过期数据。

实现购物车功能,核心是把用户临时选中的商品信息可靠地存起来,直到结算。MySQL 表结构设计要兼顾灵活性、扩展性和查询效率,不能只存“商品ID+数量”,还得考虑用户身份、规格选择、库存校验等实际场景。
用户维度:区分登录/未登录状态
未登录用户用 session_id 或临时 token 标识;已登录用户直接关联 user_id。建议统一用一个字段(如 user_key)存这两种值,并加索引。避免拆成两个字段或两张表,否则后续合并逻辑复杂。
- user_key VARCHAR(64) NOT NULL —— 存 user_id(数字)或 session_id(字符串),应用层控制格式
- is_login TINYINT(1) DEFAULT 0 —— 可选,便于后台快速筛选登录用户购物车
商品与规格:支持 SKU 级别存储
商品可能有颜色、尺寸等属性,实际下单的是具体 SKU(库存单位),不是 SPUR(商品)。购物车必须记录 sku_id,而非 goods_id。
- sku_id BIGINT NOT NULL —— 关联商品SKU表,含价格、库存等关键信息
- goods_id BIGINT —— 可冗余存储,方便按商品聚合统计(如“用户加购了几个不同商品”)
- spec_info JSON —— 若SKU表不存完整规格描述,可在此存 {"color":"黑色","size":"L"},用于前端展示
基础字段:数量、时间、状态缺一不可
数量要允许更新;创建和更新时间便于清理过期数据;status 字段预留扩展(如“已失效”“被限购”)。
- quantity TINYINT UNSIGNED NOT NULL DEFAULT 1 —— 建议限制最大值(如99),防恶意填超大数
- created_at DATETIME DEFAULT CURRENT_TIMESTAMP
- updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
- status TINYINT DEFAULT 1 —— 1=有效,0=已删除/失效(软删除,不直接 DELETE)
索引与唯一性:防止重复添加
同一用户对同一 SKU 只应有一条购物车记录。用联合唯一索引强制约束,同时支撑高频查询。
- UNIQUE KEY `uk_user_sku` (`user_key`, `sku_id`, `status`) —— status 加入确保“已删”和“有效”可共存
- KEY `idx_user_status` (`user_key`, `status`, `updated_at`) —— 支撑“查某用户所有有效商品”及“按时间排序”
- KEY `idx_sku` (`sku_id`) —— 方便库存变更时反查影响哪些购物车项









