电商商品模块数据库表设计
先抛开营销和具体业务不谈
商品必然会有库存,类别,品牌,基础信息(其他字段,如名字,描述),属性(规格/参数),评论等。
属性设计
对于一件商品的属性,它应该分为规格和参数
规格:消费者选择购买的款式,如衣服尺寸x还是xl,苹果手机内存128g还是256g
参数:该商品本身固定属性,如某一衣服材质是聚酯纤维,苹果14的处理器是A14。
按照上面这件衣服,他的属性有上市年份,品牌,主材含量,使用对象等等参数信息,也有购买时可选择的规格,如颜色,尺寸等。
而在product_attribute表中可以一个type字段来分辨这是参数还是规格。
你可以发现,对于一些属性,我们可以将其归类,比如处理器,内存,操作系统等参数会在通信设备中出现,而尺寸,材质会在所有衣服出现。所以属性也有分类。
加一个商品属性分类product_attribute_category表
DROP TABLE IF EXISTS `pms_product_attribute`;
CREATE TABLE `pms_product_attribute` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`product_attribute_category_id` bigint(20) NULL DEFAULT NULL,
`name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`select_type` int(1) NULL DEFAULT NULL COMMENT '属性选择类型:0->唯一;1->单选;2->多选',
`input_type` int(1) NULL DEFAULT NULL COMMENT '属性录入方式:0->手工录入;1->从列表中选取',
`input_list` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '可选值列表,以逗号隔开',
`sort` int(11) NULL DEFAULT NULL COMMENT '排序字段:最高的可以单独上传图片',
`filter_type` int(1) NULL DEFAULT NULL COMMENT '分类筛选样式:1->普通;1->颜色',
`search_type` int(1) NULL DEFAULT NULL COMMENT '检索类型;0->不需要进行检索;1->关键字检索;2->范围检索',
`related_status` int(1) NULL DEFAULT NULL COMMENT '相同属性产品是否关联;0->不关联;1->关联',
`hand_add_status` int(1) NULL DEFAULT NULL COMMENT '是否支持手动新增;0->不支持;1->支持',
`type` int(1) NULL DEFAULT NULL COMMENT '属性的类型;0->规格;1->参数',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 74 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '商品属性参数表' ROW_FORMAT = DYNAMIC;
DROP TABLE IF EXISTS `pms_product_attribute_category`;
CREATE TABLE `pms_product_attribute_category` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`attribute_count` int(11) NULL DEFAULT 0 COMMENT '属性数量',
`param_count` int(11) NULL DEFAULT 0 COMMENT '参数数量',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 16 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '产品属性分类表' ROW_FORMAT = DYNAMIC;
对于一件商品,它肯定有很多属性,所以商品属性关联表
DROP TABLE IF EXISTS `pms_product_attribute_value`;
CREATE TABLE `pms_product_attribute_value` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`product_id` bigint(20) NULL DEFAULT NULL,
`product_attribute_id` bigint(20) NULL DEFAULT NULL,
`value` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '手动添加规格或参数的值,参数单值,规格有多个时以逗号隔开',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 517 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '存储产品参数信息的表' ROW_FORMAT = DYNAMIC;
比如这里的关联意思就是对于product7,有属性attribute1,值有X,XL,XXL(应该就是衣服尺寸)
分类设计
对于一件商品,如苹果手机,往小了说是苹果手机,往大了说是智能手机,再往大说是通信设备(电子设备)。
所以商品的类别有大有小,是一个分支结构。
我们可以用parent_id字段去记录当前类别的父类,对于商品类别,它应该有name,level(x级分类)等等,所以
DROP TABLE IF EXISTS `pms_product_category`;
CREATE TABLE `pms_product_category` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`parent_id` bigint(20) NULL DEFAULT NULL COMMENT '上机分类的编号:0表示一级分类',
`name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`level` int(1) NULL DEFAULT NULL COMMENT '分类级别:0->1级;1->2级',
`product_count` int(11) NULL DEFAULT NULL,
`product_unit` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`nav_status` int(1) NULL DEFAULT NULL COMMENT '是否显示在导航栏:0->不显示;1->显示',
`show_status` int(1) NULL DEFAULT NULL COMMENT '显示状态:0->不显示;1->显示',
`sort` int(11) NULL DEFAULT NULL,
`icon` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '图标',
`keywords` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`description` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '描述',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 56 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '产品分类' ROW_FORMAT = DYNAMIC;
库存设计
一件商品,在出货载入系统后,会有不同规格的对应库存
比如苹果14这件商品,远峰蓝128g有1000库存,远峰蓝256g有300库存。
所以库存和商品+规格的组合是对应的。
在sku_stock商品库存表中,加一个sp_data商品销售属性来表示。
根据电商作风,一个商品规格下的库存都有对应的sku编码
这个编码指导着物流和后端仓库管理。为了与id区分,加一个sku_code编码
所以库存表:
DROP TABLE IF EXISTS `pms_sku_stock`;
CREATE TABLE `pms_sku_stock` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`product_id` bigint(20) NULL DEFAULT NULL,
`sku_code` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'sku编码',
`price` decimal(10, 2) NULL DEFAULT NULL,
`stock` int(11) NULL DEFAULT 0 COMMENT '库存',
`low_stock` int(11) NULL DEFAULT NULL COMMENT '预警库存',
`pic` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '展示图片',
`sale` int(11) NULL DEFAULT NULL COMMENT '销量',
`promotion_price` decimal(10, 2) NULL DEFAULT NULL COMMENT '单品促销价格',
`lock_stock` int(11) NULL DEFAULT 0 COMMENT '锁定库存',
`sp_data` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '商品销售属性,json格式',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 243 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = 'sku的库存' ROW_FORMAT = DYNAMIC;
评论设计
每件商品都会有评论,是1对N的关系
评论comment表需要记录评论者网名nick_name,商品id,购买该商品时的规格product_attribute,评论内容content,展示状态status,评论的IP地址
DROP TABLE IF EXISTS `pms_comment`;
CREATE TABLE `pms_comment` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`product_id` bigint(20) NULL DEFAULT NULL,
`member_nick_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`product_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`star` int(3) NULL DEFAULT NULL COMMENT '评价星数:0->5',
`member_ip` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '评价的ip',
`create_time` datetime NULL DEFAULT NULL,
`show_status` int(1) NULL DEFAULT NULL,
`product_attribute` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '购买时的商品属性',
`collect_couont` int(11) NULL DEFAULT NULL,
`read_count` int(11) NULL DEFAULT NULL,
`content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL,
`pics` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '上传图片地址,以逗号隔开',
`member_icon` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '评论用户头像',
`replay_count` int(11) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '商品评价表' ROW_FORMAT = DYNAMIC;
评论也有回复评论,所以
DROP TABLE IF EXISTS `pms_comment_replay`;
CREATE TABLE `pms_comment_replay` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`comment_id` bigint(20) NULL DEFAULT NULL,
`member_nick_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`member_icon` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`content` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`create_time` datetime NULL DEFAULT NULL,
`type` int(1) NULL DEFAULT NULL COMMENT '评论人员类型;0->会员;1->管理员',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '产品评价回复表' ROW_FORMAT = DYNAMIC;
类似商品分类,和论坛系统差不多
品牌设计
和评论差不多,但是N对1(即一个商品就一个品牌,而一个品牌多商品
DROP TABLE IF EXISTS `pms_brand`;
CREATE TABLE `pms_brand` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`first_letter` varchar(8) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '首字母',
`sort` int(11) NULL DEFAULT NULL,
`factory_status` int(1) NULL DEFAULT NULL COMMENT '是否为品牌制造商:0->不是;1->是',
`show_status` int(1) NULL DEFAULT NULL,
`product_count` int(11) NULL DEFAULT NULL COMMENT '产品数量',
`product_comment_count` int(11) NULL DEFAULT NULL COMMENT '产品评论数量',
`logo` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '品牌logo',
`big_pic` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '专区大图',
`brand_story` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '品牌故事',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 60 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '品牌表' ROW_FORMAT = DYNAMIC;
总结
不加任何业务,电商中商品的设计应该有这些
- 属性设计
- 如何区分规格和参数:加个字段
- 分类
- 加parent_id分层设计
- 库存
- sku_code编码
- 某一规格下的商品的库存 sp_data来区分
- 评论
- 商品对评论,1对N
- 回复评论
- 品牌
- 商品对品牌,N对1