买菜系统的购物车商品表需要记录用户选购的菜品信息、数量、加入时间等核心数据,支撑用户查看购物车、修改商品数量、删除商品、结算等核心功能,表结构设计需要兼顾业务需求和查询性能。

购物车商品表需求分析
首先需要明确购物车商品表需要承载的业务场景,买菜系统的购物车属于临时存储场景,用户未登录时可以使用临时标识存储,登录后需要关联用户账号,同时需要记录以下核心信息:
- 购物车记录的唯一标识
- 关联的用户信息或者临时用户标识
- 关联的菜品商品信息
- 选购的商品数量
- 商品加入购物车的时间
- 商品当前的状态,比如是否下架、是否失效
表字段设计说明
结合需求分析,购物车商品表的字段设计如下,每个字段都匹配对应的业务场景:
| 字段名 | 数据类型 | 是否必填 | 说明 |
|---|---|---|---|
| id | bigint(20) | 是 | 主键,自增,购物车记录唯一标识 |
| user_id | bigint(20) | 否 | 关联的用户ID,未登录用户该字段为null |
| temp_user_key | varchar(64) | 否 | 临时用户标识,未登录用户使用,登录后关联对应用户 |
| goods_id | bigint(20) | 是 | 关联的买菜商品ID,对应商品表的主键 |
| goods_name | varchar(100) | 是 | 商品名称,冗余存储避免关联查询 |
| goods_price | decimal(10,2) | 是 | 加入购物车时的商品单价,避免商品价格变动影响购物车金额 |
| quantity | int(11) | 是 | 选购的商品数量,默认值为1 |
| is_valid | tinyint(1) | 是 | 是否有效,1为有效,0为失效,商品下架时标记为失效 |
| create_time | datetime | 是 | 商品加入购物车的时间 |
| update_time | datetime | 是 | 购物车记录更新时间,修改数量时更新 |
MySQL建表语句编写
根据上述字段设计,编写对应的MySQL建表SQL语句,同时添加合适的索引提升查询性能:
-- 创建买菜系统购物车商品表 CREATE TABLE `cart_goods` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '购物车记录ID', `user_id` bigint(20) DEFAULT NULL COMMENT '用户ID,未登录为null', `temp_user_key` varchar(64) DEFAULT NULL COMMENT '临时用户标识', `goods_id` bigint(20) NOT NULL COMMENT '商品ID', `goods_name` varchar(100) NOT NULL COMMENT '商品名称', `goods_price` decimal(10,2) NOT NULL COMMENT '加入时的商品单价', `quantity` int(11) NOT NULL DEFAULT '1' COMMENT '商品数量', `is_valid` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否有效 1有效 0失效', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), KEY `idx_user_id` (`user_id`), KEY `idx_temp_user_key` (`temp_user_key`), KEY `idx_goods_id` (`goods_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='买菜系统购物车商品表';
表结构优化建议
在实际使用中,可以根据业务需求对表结构做进一步优化:
- 如果用户量较大,可以对
user_id和temp_user_key建立联合索引,提升查询用户购物车列表的效率 - 可以定期清理超过30天未登录且未结算的无效购物车记录,避免表数据过大影响性能
- 如果商品有规格属性,比如买菜商品的重量规格,可以新增
spec_id字段关联商品规格表,存储用户选择的规格信息
常见操作示例
以下是购物车商品表的常见操作SQL示例:
查询用户购物车有效商品
-- 查询用户ID为1001的有效购物车商品 SELECT id, goods_id, goods_name, goods_price, quantity FROM cart_goods WHERE user_id = 1001 AND is_valid = 1 ORDER BY create_time DESC;
修改购物车商品数量
-- 将购物车记录ID为5的商品数量修改为3 UPDATE cart_goods SET quantity = 3 WHERE id = 5 AND user_id = 1001;
删除购物车商品
-- 删除用户ID为1001的购物车记录ID为5的商品 DELETE FROM cart_goods WHERE id = 5 AND user_id = 1001;