新零售-多规格商品数据表设计

一、数据表

1、规格类目表(用于后台添加商品时使用)
-- 规格类目表
DROP TABLE IF EXISTS `product_spec_group`;
CREATE TABLE `product_spec_group`  (
    `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '规格类目ID',
    `spec_group_sn` int(10) UNSIGNED NOT NULL COMMENT '规格类目唯一编号, 用于在只看到规格类目编号时就能快速知道是什么规格类目',
    `spec_group_name` varchar(200) NOT NULL COMMENT '规格类目名称',
    `is_delete` tinyint(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除 0-未删除 1-已删除',
    PRIMARY KEY (`id`) USING BTREE,
    UNIQUE INDEX `unq_spg_sn`(`spec_group_sn`) USING BTREE,
    UNIQUE INDEX `unq_name`(`spec_group_name`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COMMENT = '规格类目表,用于后台添加编辑商品';
2、规格名表
-- 规格名表
DROP TABLE IF EXISTS `product_spec`;
CREATE TABLE `product_spec`  (
    `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '规格ID',
    `spec_sn` int(10) UNSIGNED NOT NULL COMMENT '该规格名唯一编号',
    `spec_group_sn` int(10) UNSIGNED NOT NULL COMMENT '所属规格类目编号,关联product_spec_group',
    `spec_name` varchar(200) NOT NULL COMMENT '规格名称',
    `sort` mediumint(8) unsigned NOT NULL DEFAULT '0' COMMENT '排序',
    PRIMARY KEY (`id`) USING BTREE,
    UNIQUE INDEX `unq_spc_sn`(`spec_sn`) USING BTREE,
    INDEX `idx_spg_sn`(`spec_group_sn`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COMMENT = '商品-规格名表';

3、规格值表

-- 规格值表
DROP TABLE IF EXISTS `product_spec_value`;
CREATE TABLE `product_spec_value` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `spec_sn` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '规格名唯一编号,关联product_spec',
  `spec_value_sn` varchar(128) NOT NULL COMMENT '规格值唯一编号',
  `spec_value_name` varchar(640) NOT NULL DEFAULT '' COMMENT '规格值名称',
  `sort` mediumint(8) unsigned NOT NULL DEFAULT '0' COMMENT '排序',
  UNIQUE INDEX `unq_spv_sn`(`spec_value_sn`) USING BTREE,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='产品线规格名对应的规格值表';
4、产品表
-- 产品表
DROP TABLE IF EXISTS `product_spu`;
CREATE TABLE `product_spu`  (
    `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '产品ID',
    `title` varchar(200) NOT NULL COMMENT '标题',
    `sub_title` varchar(200) NULL DEFAULT NULL COMMENT '副标题',
    `category_id` int(10) UNSIGNED NOT NULL COMMENT '分类ID,关联product_category',
    `brand_id` int(10) UNSIGNED NULL DEFAULT NULL COMMENT '品牌ID,关联product_brand',
    `spec_group_sn` int(10) UNSIGNED NOT NULL COMMENT '规格类目唯一编码,关联product_spec_group',
    `spu_image` varchar(256) NOT NULL COMMENT '仅用于商品列表中显示的图片',
    `is_have_spec` TINYINT(1) NOT NULL COMMENT '表示该产品是否是多规格商品 0-不是 1-是',
    `sku_list` VARCHAR(256) NOT NULL DEFAULT '' COMMENT '该产品skuList json化,如果为空值,说明该产品没有规格',
    `saleable` tinyint(1) NOT NULL COMMENT '是否上架',
    `is_valid` tinyint(1) NOT NULL COMMENT '是否有效',
    `create_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
    `update_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后修改时间',
    `is_delete` tinyint(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除',
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `idx_brand_id`(`brand_id`) USING BTREE,
  INDEX `idx_category_id`(`category_id`) USING BTREE,
  INDEX `idx_spg_sn`(`spec_group_sn`) USING BTREE,
  INDEX `idx_saleable`(`saleable`) USING BTREE,
  INDEX `idx_valid`(`is_valid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COMMENT = '产品表';
5、商品表
-- 商品表
DROP TABLE IF EXISTS `product_sku`;
CREATE TABLE `product_sku`  (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '商品ID',
    `spu_id` INT(10) UNSIGNED NOT NULL COMMENT '所属产品ID,关联product_spu',
    `title` VARCHAR(200) NOT NULL COMMENT '商品标题',
    `images` JSON NULL COMMENT '商品图片',
    `price` DECIMAL(10, 2) UNSIGNED NOT NULL COMMENT '价格',
    `spec_sn_combination` varchar(128) NOT NULL DEFAULT '' COMMENT '商品规格组合,比如 1_27_99',
    `saleable` Tinyint(1) NOT NULL COMMENT '是否上架',
    `valid` Tinyint(1) NOT NULL COMMENT '是否有效',
    `create_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
    `update_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后修改时间',
    `is_deleted` Tinyint(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除',
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `idx_spu_id`(`spu_id`) USING BTREE,
  INDEX `idx_saleable`(`saleable`) USING BTREE,
  INDEX `idx_valid`(`valid`) USING BTREE,
  FULLTEXT INDEX `title`(`title`)
) ENGINE = InnoDB CHARACTER SET = utf8 COMMENT = '商品表';
6、规格及规格值使用记录维护表

冗余表,维护表,用于记录已经被使用到的规格名唯一编号和规格值唯一编号。
商品添加或编辑时,事务将当前产品spu_id下的所有记录删除,并添加新添加或修改的数据。在后台进行删除规格或规格值时使用到,如果有商品在使用,则不允许删除。

DROP TABLE IF EXISTS `spec_and_value_use_record`;
CREATE TABLE `spec_and_value_use_record` (
    `spu_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '产品ID',
    `spec_sn` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '规格名唯一编号',
    `spec_value_sn` varchar(128) NOT NULL DEFAULT '' COMMENT '规格值唯一编号',
    `record_type` tinyint(1) NOT NULL DEFAULT '1' COMMENT '记录类型 1-规格名 2-规格值',
  PRIMARY KEY (`spu_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='规格及规格值使用记录表';

二、请求接口及返回接口需要注意的地方

1、后台操作添加或修改商品时,我们需要组装并存储到指定字段的数据格式

建议按照下面格式组装一个array,存储到product_spu 中的 sku_list 字段,用于之后wap端查询时返回数据。

{
    "sku_list": [
        {
            "spec_sn":"100",
            "spec_value_sn_list":["10001", "10002"]
        },
        {
            "spec_sn":"101",
            "spec_value_sn_list":["10005", "10006"]
        }
    ]
}

2、wap端请求商品详情时,我们返回给前端的数据格式

无规格商品:

{
    "is_have_spec":0,
    "sku_sn":"100030",
    "price":14000,
    "inventory":19
}

多规格商品:

{
    "is_have_spec":1,
    "sku_list": [
        {
            "spec_name":"码数",
            "spec_value_list":[
                {
                    "spec_value_sn":"10001",
                    "spec_value":"L",
                    "sort":1
                },
                {
                    "spec_value_sn":"10002",
                    "spec_value":"XL",
                    "sort":2
                }
            ]
        },
        {
             "spec_name":"颜色",
             "spec_value_list":[
                 {
                    "spec_value_sn":"10005",
                    "spec_value":"绿色",
                    "sort":1
                 },
                 {
                    "spec_value_sn":"10006",
                    "spec_value":"紫色",
                    "sort":5
                 }
            ]
        }
    ],
    "sku_price":[
        {
            "sku_sn":"iphone_12_001",
            "spec_value_sn_combination":["10001", "10005"],
            "price":13000,
            "inventory":23
        },
        {
            "sku_sn":"iphone_12_002",
            "spec_value_sn_combination":["10001", "10006"],
            "price":14000,
            "inventory":66
        },
        {
            "sku_sn":"iphone_12_003",
            "spec_value_sn_combination":["10002", "10005"],
            "price":13500,
            "inventory":11
        },
        {
            "sku_sn":"iphone_12_004",
            "spec_value_sn_combination":["10002", "10006"],
            "price":6666,
            "inventory":0
        }
    ] 
}

三、需要重点说明的点

如果添加的是无规格产品,我们同样需要在product_sku表中添加一条数据,与多规格产品不同之处只是product_spu表中的is_have_spec字段需要标记为0,并且sku_list为空。

其他的比如商品sku_sn、商品详情图片等数据都需要存储在product_sku数据表中。

之后的零售店与各地仓库的商品库存直接关联到最小库存单位sku上,即关联sku_sn。

四、SQL文件下载

SQL文件:
链接: https://pan.baidu.com/s/1mVlRSUjL1aRPmuUsO-6eXQ
提取码: n172