简介

一般情况下我们使用5张表就可以解决基本的需求了:

  • 商品分类表:category
  • 商品表(即SPU表):表:product
  • 商品规格表(即sku表):product_specs
  • 属性key表:attribute_key
  • 属性value表:attribute_value

具体设计

概述

spu表和sku表实现不同商品的存储:spu表使用attribute_list字段保存属性集合,查询时使用product_id和product_specs去sku表中获取的具体的单品信息。 spu表中可以增加一些商品的公共信息字段,例如名称、发布的商家、发布日期、上架状态; sku表中增加一些每个单品不同的字段,比如不同的单品有不同图片和名称或者详情说明等等,反正根据业务进行扩展

核心思路就是把弹性字段使用json存储,这样设计的优点是数据表结构稳定,不用在商品增加属性后增加字段, 缺点是商品数据的解析复杂,弹性字段需要在业务代码中进行处理,增加了业务代码的复杂度。

商品分类表:tb_product_category

该表主要是描述商品的分类。此表采用无限层级树状数据结构,程序使用递归算法来遍历分类下的所有子分类,pid是父级分类, paid=null时说明是根节点, 属于一级类别;
属性:id,pid,name等

商品表表(即spu表):tb_product

存储商品信息。表中关键字段是category_id和attribute_list两个字段:

  • category_id:记录商品属于哪个分类, 用于通过分类进行商品搜索;
  • attribute_list:记录的是所有属性的集合,这个字段采用json格式存储,便于前端解析;前端解析后可以在页面显示出商品的所有属性, 用户点击选择出属性组合后,前端可以拼接成形如{"内存":"2G","颜色":"红色","尺寸":"20cm"}的json格式加上商品id在(商品规格表 tb_product_specs)查询到具体的单品,随即获取到具体单品的库存和价格等信息;
    属性:id,category_id,name,attribute_list等

商品规格表(即:sku表):tb_product_specs

存储商品的具体规格单品,即sku。sku表保存的是具体的单品信息,比如具体规格的库存和价格等,核心字段是product_id和product_specs:

  • product_id 记录的是spu表中的商品id
  • product_specs 记录的是该单品具体的属性值(规格值);
    属性:id,product_id,product_specs等

属性key表:tb_attribute_key

用于存储sku的属性,比如:机身颜色,存储容量
属性key表和属性value表仅用于管理后台页面生成属性选项,管理员在发布新商品时勾选属性,方便规格的录入和保证正确性;

属性value表:tb_attribute_value

用于存储sku的属性值,比如:6+128G,8+128G,8+256G

总结

上述数据表设计方案适用于商品类别差异不是很大的情形,通过表的字段可以发现不同的商品之间变化的信息只有 attribute_list 字段, 而这个字段通过json来存储各种不同的属性集合, 同样sku表中变化的字段只有 product_specs 也是通过json来存储各种不同属性组合。

改进方案

将tb_product、tb_brand、tb_product_specs表中的info字段分别抽取到单独的表中。

附:相关表的SQL文件

/*Navicat Premium Data TransferSource Server         : localhostSource Server Type    : MySQLSource Server Version : 80025Source Host           : localhost:3306Source Schema         : testTarget Server Type    : MySQLTarget Server Version : 80025File Encoding         : 65001Date: 07/12/2021 11:19:44
*/SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for tb_attribute_key
-- ----------------------------
DROP TABLE IF EXISTS `tb_attribute_key`;
CREATE TABLE `tb_attribute_key`  (`id` int(0) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '编号',`attribute_name` varchar(22) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '属性名',`priority` int(0) UNSIGNED NULL DEFAULT NULL COMMENT '优先级',`category_id` int(0) UNSIGNED NULL DEFAULT NULL COMMENT '类别编号',`create_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',`update_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',PRIMARY KEY (`id`) USING BTREE,INDEX `category_id`(`category_id`) USING BTREE,CONSTRAINT `tb_attribute_key_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `tb_product_category` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '属性key表' ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of tb_attribute_key
-- ------------------------------ ----------------------------
-- Table structure for tb_attribute_value
-- ----------------------------
DROP TABLE IF EXISTS `tb_attribute_value`;
CREATE TABLE `tb_attribute_value`  (`id` int(0) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '编号',`attribute_id` int(0) UNSIGNED NULL DEFAULT NULL COMMENT '属性编号',`priority` int(0) UNSIGNED NULL DEFAULT NULL COMMENT '优先级',`attribute_value` varchar(22) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '属性值',`create_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',`update_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',PRIMARY KEY (`id`) USING BTREE,INDEX `category_id`(`attribute_id`) USING BTREE,CONSTRAINT `tb_attribute_value_ibfk_1` FOREIGN KEY (`attribute_id`) REFERENCES `tb_attribute_key` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '属性value表' ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of tb_attribute_value
-- ------------------------------ ----------------------------
-- Table structure for tb_brand
-- ----------------------------
DROP TABLE IF EXISTS `tb_brand`;
CREATE TABLE `tb_brand`  (`id` int(0) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '品牌编号',`name` varchar(18) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '品牌名称',`logo` varchar(180) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '品牌LOGO',`info` varchar(220) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '品牌描述',`status` tinyint(0) UNSIGNED NULL DEFAULT 1 COMMENT '状态 1上架  2下架',`create_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',`update_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '品牌表' ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of tb_brand
-- ------------------------------ ----------------------------
-- Table structure for tb_product
-- ----------------------------
DROP TABLE IF EXISTS `tb_product`;
CREATE TABLE `tb_product`  (`id` int(0) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '商品编号',`name` varchar(28) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '商品名称',`attribute_list` json NULL COMMENT '商品属性列表',`category_id` int(0) UNSIGNED NULL DEFAULT NULL COMMENT '类别编号',`brand_id` int(0) UNSIGNED NULL DEFAULT NULL COMMENT '品牌编号',`status` tinyint(0) UNSIGNED NULL DEFAULT NULL COMMENT '状态 1上架  2下架',`info` varchar(180) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',`create_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT ' 创建时间',`update_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT ' 更新时间',PRIMARY KEY (`id`) USING BTREE,INDEX `category_id`(`category_id`) USING BTREE,INDEX `brand_id`(`brand_id`) USING BTREE,CONSTRAINT `tb_product_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `tb_product_category` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,CONSTRAINT `tb_product_ibfk_2` FOREIGN KEY (`brand_id`) REFERENCES `tb_brand` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '商品表(SPU)' ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of tb_product
-- ----------------------------
INSERT INTO `tb_product` VALUES (1, 'IPHONE8', '{\"商品简介\": {\"品牌\": \"Apple\", \"系统\": \"iOS\", \"充电器\": \"其他\", \"分辨率\": \"其他\", \"支持IPv6\": \"支持IPv6\", \"商品产地\": \"中国大陆\", \"商品名称\": \"AppleiPhone 13\", \"商品毛重\": \"320.00g\", \"商品编号\": \"100014352501\", \"机身存储\": \"256GB\", \"运行内存\": \"其他\"}, \"规格与包装\": {\"主体\": {\"品牌\": \"Apple\", \"上市年份\": \"2021年\", \"上市月份\": \"9月\", \"产品名称\": \"Apple iPhone 13 (A2634) 256GB 午夜色 支持移动联通电信5G 双卡双待手机\", \"入网型号\": \"A2634\", \"首销日期\": \"24日\"}, \"基本信息\": {\"机身材质\": \"以官网信息为准\", \"机身重量(g)\": \"173g\", \"机身厚度(mm)\": \"7.65mm\", \"机身宽度(mm)\": \"71.5mm\", \"机身长度(mm)\": \"146.7mm\"}}}', NULL, NULL, NULL, NULL, '2021-12-07 10:52:15', '2021-12-07 10:52:15');-- ----------------------------
-- Table structure for tb_product_category
-- ----------------------------
DROP TABLE IF EXISTS `tb_product_category`;
CREATE TABLE `tb_product_category`  (`id` int(0) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '类别编号',`name` varchar(12) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '类别名称',`status` tinyint(0) UNSIGNED NULL DEFAULT 1 COMMENT '状态:1上架 2下架',`priority` int(0) UNSIGNED NULL DEFAULT NULL COMMENT '优先级',`pid` int(0) UNSIGNED NULL DEFAULT NULL COMMENT '父类别编号',`create_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',`update_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',PRIMARY KEY (`id`) USING BTREE,INDEX `pid`(`pid`) USING BTREE,CONSTRAINT `tb_product_category_ibfk_1` FOREIGN KEY (`pid`) REFERENCES `tb_product_category` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '商品类别表' ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of tb_product_category
-- ----------------------------
INSERT INTO `tb_product_category` VALUES (1, 'aa', 1, NULL, NULL, '2021-12-07 10:34:29', '2021-12-07 10:34:29');
INSERT INTO `tb_product_category` VALUES (2, 'bb', 1, NULL, 1, '2021-12-07 10:34:36', '2021-12-07 10:34:36');
INSERT INTO `tb_product_category` VALUES (3, 'cc', 1, NULL, 2, '2021-12-07 10:34:42', '2021-12-07 10:34:42');
INSERT INTO `tb_product_category` VALUES (4, 'dd', 1, NULL, 3, '2021-12-07 10:34:51', '2021-12-07 10:34:51');-- ----------------------------
-- Table structure for tb_product_specs
-- ----------------------------
DROP TABLE IF EXISTS `tb_product_specs`;
CREATE TABLE `tb_product_specs`  (`id` int(0) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '规格编号',`product_id` int(0) UNSIGNED NULL DEFAULT NULL COMMENT '商品编号',`name` varchar(24) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '规格名称',`sell_point` varchar(48) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '卖点',`product_specs` json NULL COMMENT '规格列表',`price` decimal(10, 2) NULL DEFAULT NULL COMMENT '售价',`barcode` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '条形码',`img` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '首图',`pics` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '图片列表',`amount` int(0) UNSIGNED NULL DEFAULT NULL COMMENT '库存',`status` tinyint(0) UNSIGNED NULL DEFAULT 1 COMMENT '状态 1上架  2下架',`info` varchar(180) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注信息',`create_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',`update_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',PRIMARY KEY (`id`) USING BTREE,INDEX `product_id`(`product_id`) USING BTREE,CONSTRAINT `tb_product_specs_ibfk_1` FOREIGN KEY (`product_id`) REFERENCES `tb_product` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '商品规格表(sku表)' ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of tb_product_specs
-- ----------------------------
INSERT INTO `tb_product_specs` VALUES (1, 1, 'IPHONE8 PLUS', '贵,信号不好', '{\"版本\": \"128GB\", \"颜色\": \"红色\", \"购买方式\": \"公开版\"}', 5999.00, NULL, NULL, NULL, 1000, 1, NULL, '2021-12-07 10:59:18', '2021-12-07 10:59:18');
INSERT INTO `tb_product_specs` VALUES (2, 1, 'IPHONE8 MINI', '轻,信号好', '{\"版本\": \"256GB\", \"颜色\": \"玫瑰金色\", \"增值保障\": \"2年259\", \"购买方式\": \"官方标配\"}', 4200.00, NULL, NULL, NULL, 12, 1, NULL, '2021-12-07 10:59:30', '2021-12-07 11:01:37');SET FOREIGN_KEY_CHECKS = 1;

【精品】电商项目 中 基于SPU与SKU的 商品 数据库表设计相关推荐

  1. 【项目实战】电商项目中的SPU与SKU傻傻分不清楚

    一.SPU与SKU介绍 电商里面一般对商品的单位都有 SPU 或 SKU,这两个概念有什么区别? 在电商项目中,SPU和SKU是两个常用的概念,它们分别表示不同的商品信息. 从广义上讲,类目>S ...

  2. 电商项目中的SPU和SKU概念

    SPU SPU:Standard Product Unit,标准产品单位. 概念:SPU 是商品信息聚合的最小单位[即:商品共同的属性],是一组可复用.易检索的标准化信息的集合,该集合描述了一个产品的 ...

  3. 电商系统中的SPU和SKU

    1.SPU介绍 SPU = Standard Product Unit(标准产品单元) SPU是商品信息聚合的最小单位,是一组可复用.易检索的标准化信息的集合,该集合描述了一个产品的特性.通俗的讲,除 ...

  4. 美多商城项目:商品数据库表设计、准备商品数据、首页广告、商品列表页

    一.商品数据库表设计 1.1 SPU和SKU 在电商中对于商品,有两个重要的概念:SPU和SKU 1. SPU介绍 SPU = Standard Product Unit (标准产品单位) SPU是商 ...

  5. 电商项目中的经典问题

    转载自:https://blog.csdn.net/A_BlackMoon/article/details/80094814 请描述一下这个系统? [回答技巧] 从3个方面来回答这个问题: |--系统 ...

  6. 电商项目中订单系统到底该怎么设计才好?(至尊典藏版)

    目录 前言 一.订单系统架构 1. 订单系统在企业中的角色 2. 订单系统与各业务系统的关系 3. 订单系统上下游关系​编辑 4. 订单系统的业务架构​编辑 二.订单系统核心功能 1. 订单中所包含的 ...

  7. 关于电商项目中的秒杀实现方案

    秒杀:秒杀场景一般会在电商网站举行一些活动或者节假日在12306网站上抢票时遇到.对于电商网站中一些稀缺或者特价商品,电商网站一般会在约定时间点对其进行限量销售,因为这些商品的特殊性,会吸引大量用户前 ...

  8. 电商项目中SPU与SKU的设计

    1. 先说明几个概念. 电商网站采用在商品模块,常采用spu+sku的数据结构算法,这种算法可以将商品的属性和商品的基本信息分离,分开维护,这样我们就可以在不同的类目下自定义商品信息和分类的属性信息, ...

  9. 电商项目中两个重要的属性SPU和SKU

    1.SPU(Standard Product Unit),标准产品单位(商品共有的属性和集合形成的SPU) SPU是商品信息聚合的最小单位,是一组可复用.易检索的标准化信息的集合,该集合描述了一个产品 ...

最新文章

  1. 福利 | Python、深度学习、机器学习、TensorFlow 好书推荐
  2. Git 高级用法小抄
  3. bzoj 3232 01分数规划+最大权封闭子图判定
  4. 和包支付的钱哪里来_2019年支付宝年度账单出炉,来看看你究竟花了多少钱
  5. 生物信息考研C语言,四川大学生物信息学初试经验分享
  6. MySQL入门之索引
  7. 攻略:简易VBS病毒制作
  8. SourceOffsite安装配置
  9. 百度离线地图JS API V3.0
  10. 关于手机打开pdf文档乱码的解决办法
  11. 2021-05-13
  12. Linux系统(三) 系统基础
  13. 计算机省一级b类模拟试题,江苏省计算机一级模拟试题及答案
  14. 端游与页游之战:微端网游突出重围
  15. 幼儿园stem教育的发展有什么意义
  16. 有哪些好用的搜索引擎网站推荐?
  17. kettle 大数据整合(三)
  18. 软件测试(测试用例、配置管理、bug、软件需求规格说明书、需求)
  19. openwrt x86 登录不上_OpenWrt X86 安装教程
  20. 一文读懂哈希时间锁的合约机制、改进方向与应用场景

热门文章

  1. Apollo:决策模块
  2. CentOS8下配置静态IP后ping不通自身网关
  3. RHCE 第十二天 搭建小松鼠服务squirrelmail
  4. 携程网首页案例-移动端
  5. Xbox One:微软发布“改变一切”的新游戏机
  6. 【2023最新版】Hexo+github搭建个人博客并绑定个人域名
  7. 这么好的资源不能浪费了啊
  8. linux查看磁盘 lsdsk,ORA-01565: error in identifying file '+DATA/rac/dataile/datf
  9. TCP协议-TCP的流量控制
  10. 操作系统练习题(三四五章)