Youlai-Mall 商品管理系统数据库设计解析
概述
本文将深入分析 Youlai-Mall 电商平台中商品管理模块(PMS)的数据库设计,帮助开发者理解其核心数据结构和关系。该设计采用 MySQL 8.0 作为数据库引擎,包含了商品分类、品牌、规格属性以及商品信息等核心表结构。
数据库表结构详解
1. 商品品牌表(pms_brand)
商品品牌表用于存储平台销售商品的品牌信息:
CREATE TABLE `pms_brand` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(64) NOT NULL COMMENT '品牌名称',
`logo_url` varchar(255) NULL DEFAULT NULL COMMENT 'LOGO图片',
`sort` int NULL DEFAULT NULL COMMENT '排序',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '商品品牌表' ROW_FORMAT = DYNAMIC;
关键字段说明:
name: 品牌名称,如"小米"、"华为"等logo_url: 品牌LOGO的URL地址sort: 用于品牌展示时的排序字段
示例数据:
INSERT INTO `pms_brand` VALUES (1, '有来', 'http://a.youlai.tech:9000/default/5409e3deb5a14b8fa8cb4275dee0e25d.png', 1, '2021-07-11 19:56:58', '2021-07-11 20:02:54');
INSERT INTO `pms_brand` VALUES (10, '小米', 'http://a.youlai.tech:9000/default/6a5a606fc60742919149a7861bf26cd5.jpg', 2, '2022-03-05 16:12:16', '2022-03-05 16:12:16');
2. 商品分类表(pms_category)
商品分类表采用树形结构设计,支持多级分类:
CREATE TABLE `pms_category` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(64) NOT NULL COMMENT '商品分类名称',
`parent_id` bigint NOT NULL COMMENT '父级ID',
`level` int NULL DEFAULT NULL COMMENT '层级',
`icon_url` varchar(255) NULL DEFAULT NULL COMMENT '图标地址',
`sort` int NULL DEFAULT NULL COMMENT '排序',
`visible` tinyint(1) NULL DEFAULT 1 COMMENT '显示状态:( 0:隐藏 1:显示)',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '商品分类表' ROW_FORMAT = DYNAMIC;
关键字段说明:
parent_id: 父分类ID,0表示一级分类level: 分类层级(1-一级分类,2-二级分类,3-三级分类)visible: 控制分类是否在前台显示
示例数据:
INSERT INTO `pms_category` VALUES (3, '手机配件', 0, 1, NULL, 2, 1, NULL, '2022-07-07 22:56:53');
INSERT INTO `pms_category` VALUES (4, '智能手机', 3, 2, NULL, 1, 1, NULL, NULL);
INSERT INTO `pms_category` VALUES (5, '5g手机', 4, 3, 'https://oss.youlai.tech/default/6ffb37110ac2434a9882b9e8968b2887.jpg', 1, 1, NULL, '2022-07-08 00:28:38');
3. 商品属性表(pms_category_attribute)
该表存储商品分类的属性信息,包括规格属性和参数属性:
CREATE TABLE `pms_category_attribute` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`category_id` bigint NOT NULL COMMENT '分类ID',
`name` varchar(64) NOT NULL COMMENT '属性名称',
`type` tinyint NOT NULL COMMENT '类型(1:规格;2:属性;)',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE,
INDEX `fk_pms_attr_pms_category`(`category_id` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '商品属性表' ROW_FORMAT = DYNAMIC;
关键字段说明:
type: 1表示规格(如颜色、尺寸等),2表示参数(如上市时间等)category_id: 关联到商品分类表
示例数据:
INSERT INTO `pms_category_attribute` VALUES (34, 5, '颜色', 1, '2021-07-11 17:57:06', '2022-07-01 00:08:19');
INSERT INTO `pms_category_attribute` VALUES (35, 5, '规格', 1, '2021-07-11 18:00:06', '2022-07-01 00:08:19');
INSERT INTO `pms_category_attribute` VALUES (36, 5, '上市时间', 2, '2021-07-11 18:00:08', '2022-06-01 17:41:05');
4. 商品表(pms_spu)
SPU(Standard Product Unit)表存储商品的基本信息:
CREATE TABLE `pms_spu` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(64) NOT NULL COMMENT '商品名称',
`category_id` bigint NOT NULL COMMENT '商品类型ID',
`brand_id` bigint NULL DEFAULT NULL COMMENT '商品品牌ID',
`origin_price` bigint NOT NULL COMMENT '原价【起】',
`price` bigint NOT NULL COMMENT '现价【起】',
`sales` int NULL DEFAULT 0 COMMENT '销量',
`pic_url` varchar(255) NULL DEFAULT NULL COMMENT '商品主图',
`album` json NULL COMMENT '商品图册',
`unit` varchar(16) NULL DEFAULT NULL COMMENT '单位',
`description` varchar(255) NULL DEFAULT NULL COMMENT '商品简介',
`detail` text NULL COMMENT '商品详情',
`status` tinyint NULL DEFAULT 1 COMMENT '商品状态(0:下架 1:上架)',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE,
INDEX `fk_pms_spu_pms_brand`(`brand_id` ASC) USING BTREE,
INDEX `fk_pms_spu_pms_category`(`category_id` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '商品表' ROW_FORMAT = DYNAMIC;
关键字段说明:
album: 使用JSON类型存储商品相册图片URL数组detail: 存储商品详情HTML内容status: 控制商品上下架状态
示例数据:
INSERT INTO `pms_spu` VALUES (1, 'Galaxy Z Fold5', 5, 10, 599900, 599900, 1, 'https://shop-image.samsung.com.cn/productv5/img/2023/07/26/64c0e30fe4b08db29258c50c.png', '[\"https://shop-image.samsung.com.cn/productv5/img/2023/07/26/64c0e30fe4b08db29258c50c.png\"]', '台', '好快,好稳,\n好一次强上加强。', '<p><img src=\"https://shop-image.samsung.com.cn/productv5/img/2023/11/03/65449d3ee4b08db20823bcbe.jpg\" alt=\"\" data-href=\"\" style=\"width: 449.00px;height: 449.00px;\"/></p>', 1, NULL, '2022-07-03 14:16:16');
5. 商品SKU表(pms_sku)
SKU(Stock Keeping Unit)表存储商品的具体规格和库存信息:
CREATE TABLE `pms_sku` (
`id` bigint NOT NULL AUTO_INCREMENT,
`sku_sn` varchar(64) NULL DEFAULT NULL COMMENT '商品编码',
`spu_id` bigint NOT NULL COMMENT 'SPU ID',
`name` varchar(128) NULL DEFAULT NULL COMMENT '商品名称',
`spec_ids` varchar(255) NULL DEFAULT NULL COMMENT '商品规格值,以英文逗号(,)分割',
`price` bigint NULL DEFAULT NULL COMMENT '商品价格(单位:分)',
`stock` int UNSIGNED NULL DEFAULT NULL COMMENT '库存数量',
`locked_stock` int NULL DEFAULT NULL COMMENT '库存锁定数量',
`pic_url` varchar(255) NULL DEFAULT NULL COMMENT '商品图片地址',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE,
INDEX `fk_pms_sku_pms_spu`(`spu_id` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '商品库存表' ROW_FORMAT = DYNAMIC;
关键字段说明:
spec_ids: 存储该SKU对应的规格ID组合,格式如"1_3"表示颜色ID为1,规格ID为3price: 以分为单位存储,避免浮点数计算精度问题locked_stock: 已锁定库存(如已下单未支付的商品数量)
示例数据:
INSERT INTO `pms_sku` VALUES (1, 'sn001', 1, '黑 6+128g', '1_3', 399900, 990, 150, 'https://www.youlai.tech/files/default/c25b39470474494485633c49101a0f5d.png', '2021-08-08 00:43:26', '2022-07-03 14:16:16');
6. 商品属性关联表(pms_spu_attribute)
该表存储商品的具体属性值:
CREATE TABLE `pms_spu_attribute` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`spu_id` bigint NOT NULL COMMENT '产品ID',
`attribute_id` bigint NULL DEFAULT NULL COMMENT '属性ID',
`name` varchar(64) NOT NULL COMMENT '属性名称',
`value` varchar(128) NOT NULL COMMENT '属性值',
`type` tinyint NOT NULL COMMENT '类型(1:规格;2:属性;)',
`pic_url` varchar(255) NULL DEFAULT NULL COMMENT '规格图片',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE,
INDEX `fk_pms_spu_attribute_pms_attr`(`name` ASC) USING BTREE,
INDEX `fk_pms_spu_attribute_pms_spu`(`spu_id` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '商品属性/规格表' ROW_FORMAT = DYNAMIC;
关键字段说明:
- 规格类型的属性会有对应的图片URL
- 参数类型的属性只包含名称和值
示例数据:
INSERT INTO `pms_spu_attribute` VALUES (1, 1, 34, '颜色', '黑', 1, 'https://www.youlai.tech/files/default/c25b39470474494485633c49101a0f5d.png', NULL, '2022-07-03 14:16:16');
INSERT INTO `pms_spu_attribute` VALUES (5, 1, 36, '上市时间', '2021-07-17', 2, NULL, NULL, '2022-07-03 14:16:16');
数据库设计特点分析
-
价格存储设计:所有价格字段均以分为单位存储,使用bigint类型,避免浮点数计算带来的精度问题。
-
分类层级设计:采用parent_id+level的方式实现多级分类,便于查询和展示。
-
商品属性分离:将属性分为规格(影响SKU)和参数(不影响SKU)两类,设计更加清晰。
-
JSON类型应用:在商品相册字段使用JSON类型,便于存储和查询数组结构数据。
-
库存管理:设计了库存和锁定库存字段,支持库存预占功能,防止超卖。
-
字符集选择:统一使用utf8mb4字符集,支持完整的Unicode字符,包括emoji表情。
实际应用建议
-
商品搜索优化:建议为商品名称、描述等字段添加全文索引,提升搜索性能。
-
库存操作:对库存字段的更新应使用乐观锁,避免并发问题。
-
价格展示:前端展示时需将存储的分转换为元,通常除以100即可。
-
分类查询:多级分类查询可使用递归CTE(MySQL 8.0+支持)提高查询效率。
-
属性管理:对于频繁变更的属性,可考虑使用EAV(实体-属性-值)模型,但会增加查询复杂度。
通过以上分析,可以看出 Youlai-Mall 的商品管理系统数据库设计考虑了电商平台的实际需求,结构清晰合理,既满足了功能需求,又考虑了性能因素,是一个值得参考的设计方案。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



