如何设计新零售行业数据库?不懂SKU、SPU?带你走进数据库设计,用最容易理解的方式讲述数据库设计思想

数据库设计思想—使用新零售行业数据库带你走进数据库设计

本篇文章会详细描述数据库设计中问题的解决思路,为什么不用其他方案都会说明。

可能有的小伙伴只是想找数据库做参考,帮忙帮到底,点击下载

概述

像酒店管理系统,财务报表系统,在线教育系统的表设计相对来说是比较简单的,因为他的属性是固定的。比如在线教育的课程表,大致包含课程详情、价格、教师等信息,比较容易抽象出来。设计的难点在于要提前规划好可能会用到的属性,避免后期修改造成前后端大量改动,费时费力,

而新零售系统的数据库设计可能会比你想想中困难一些,来举一个例子

苹果手机有内存、CPU、颜色等属性,而手机壳有哪些?材质、颜色……

我们的发现,不同的商品,他的规格属性并不相同,我们无法用固定的属性去设计表。所以接下来我们引入 SKUSPU 的概念,带你用最通俗易懂的方式理解 SKUSPU

1. 商品相关数据库设计

SKU与SPU

SPU:标准产品单位,描述一个商品的各种特性。举例:苹果12就是一个SPU

SKU:库存进出计量的单位,SKU是物理上不可分割的最小单元。举例:紫色8+128的苹果12、蓝色6+64的苹果12

思考:SKU表该如何设计,将所有的属性都设计成一个字段吗?我们来看一下如果这样设计会出现什么样的现象。

主键商品名称CPU内存……保质期尺码
1苹果12a148GB……
2六个核桃……60天
3小米T恤……XXL

结论:首先就是字段冗余现象,其次大量不需要的属性非常臃肿,这个数据表如果这样设计,那真是太糟糕了。

如何设计品类参数?参数与SKU的关系?

未命名文件

分析:

  • 从品类表开始看,一条品类表信息对应多条参数表,例如手机是一个品类,对应CPU、内存、尺寸、电池等参数
  • 一个产品表对应一个品类表,一个产品可以有多个商品。

详细设计品类和参数表

品类表E-R图[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s1K1LGPd-1626746846624)(https://xk857.com/typora/2021/05%E5%93%81%E7%B1%BB%E8%A1%A8E-R%E5%9B%BE%20(1)].png)

数据库设计如下

名称类型长度注释
idint11主键
spg_idint11品类编号
namevarchar200品类名称

SQL语句如下

CREATE TABLE `t_spec_group` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `spg_id` int(11) NOT NULL COMMENT '品类编号',
  `name` varchar(255) DEFAULT NULL COMMENT '品类名称',
  PRIMARY KEY (`id`),
  UNIQUE KEY `unq_id` (`id`) USING BTREE COMMENT '主键唯一索引',
  UNIQUE KEY `unq_spg_id` (`spg_id`) USING BTREE COMMENT '品类编号唯一索引',
  KEY `idex_speg_id` (`spg_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

常见问题与注意事项:

  1. 主键类型选择,我这里是单体环境,因此设计成自增(主要是因为测试方便,偷个懒)。分布式环境下,MySQL如果做集群,就需要采用 varchar 类型存放分布式ID,具体可用UUID或者雪花算法等生成ID
  2. 有了ID为什么还需要使用品类编号?ID是无意义的,品类编号可设计成有意义的,例如前四位是有意义的,如1-1000代表电子类产品,1001-2000代表服装类产品,具体含义自行设计。
  3. 注意给主键和品类编号添加唯一索引。
  4. 为什么使用utf8mb4而不是utf8,因为utf8不是真正的utf8。具体见博文:点击前往
  5. 表名为什么以“t”开头,这里的“t”代表表,“v”代表视图,有的地方设计成“tb”都是ok的。

插入几条数据:

INSERT INTO t_spec_group (spg_id, `name`) VALUES (10001, '手机');
INSERT INTO t_spec_group (spg_id, `name`) VALUES (10002, '数据线');
INSERT INTO t_spec_group (spg_id, `name`) VALUES (10003, '充电器');
INSERT INTO t_spec_group (spg_id, `name`) VALUES (20001, '毛衣');
INSERT INTO t_spec_group (spg_id, `name`) VALUES (20002, 'T恤');

参数表E-R图如下[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-umcLSLmc-1626746846626)(https://xk857.com/typora/2021/05%E5%93%81%E7%B1%BB%E8%A1%A8E-R%E5%9B%BE.png)]

直接上SQL语句

CREATE TABLE `t_spec_param` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `spp_id` int(11) NOT NULL COMMENT '参数编号',
  `spg_id` int(11) NOT NULL COMMENT '品类编号',
  `name` varchar(200) NOT NULL COMMENT '参数名称',
  `numeric` tinyint(1) NOT NULL COMMENT '是否为数字参数',
  `unit` varchar(200) DEFAULT NULL COMMENT '单位名称',
  `generic` tinyint(1) NOT NULL COMMENT '是否为通用参数',
  `searching` tinyint(1) DEFAULT NULL COMMENT '可搜索?',
  `segments` varchar(500) DEFAULT NULL COMMENT '参数值',
  PRIMARY KEY (`id`),
  KEY `ids_spg_id` (`spg_id`),
  KEY `ids_spp_id` (`spp_id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COMMENT='参数表';

数据:

INSERT INTO t_spec_param (spp_id, spg_id, `name`, `numeric`, unit, generic, searching, segments) VALUES (10001, 1, 'CPU', 0, NULL, 1, 0, NULL);
INSERT INTO t_spec_param (spp_id, spg_id, `name`, `numeric`, unit, generic, searching, segments) VALUES (10001, 2, '运存', 1, 'GB', 1, 1, NULL);
INSERT INTO t_spec_param (spp_id, spg_id, `name`, `numeric`, unit, generic, searching, segments) VALUES (10001, 3, '屏幕尺寸', 1, '英寸', 1, 1, NULL);
INSERT INTO t_spec_param (spp_id, spg_id, `name`, `numeric`, unit, generic, searching, segments) VALUES (10001, 4, '内存', 1, 'GB', 1, 1, NULL);
INSERT INTO t_spec_param (spp_id, spg_id, `name`, `numeric`, unit, generic, searching, segments) VALUES (10002, 5, '长度', 1, '米', 1, 1, NULL);
INSERT INTO t_spec_param (spp_id, spg_id, `name`, `numeric`, unit, generic, searching, segments) VALUES (10003, 6, '功率', 1, '瓦', 1, 1, NULL);
INSERT INTO t_spec_param (spp_id, spg_id, `name`, `numeric`, unit, generic, searching, segments) VALUES (10001, 7, '材质', 0, NULL, 1, 1, '纯毛/混纺/化纤');

在这里插入图片描述

设计品牌和分类关系

品牌表

品牌表E-R图如下

品牌表E-R图

建表SQL语句

CREATE TABLE `t_brand` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `name` varchar(150) NOT NULL COMMENT '品牌名称',
  `image` varchar(500) DEFAULT NULL COMMENT '商标图片',
  `letter` char(1) NOT NULL COMMENT '品牌首字母',
  PRIMARY KEY (`id`),
  UNIQUE KEY `unq_name` (`name`),
  KEY `idx_letter` (`letter`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;

填充数据

INSERT INTO t_brand (`name`, image, letter) VALUES ('联想', 'https://p1.lefile.cn/product/adminweb/2018/12/13/2d4534f6-29f3-4a05-8e68-97d9904c7bd2.png', 'L');
INSERT INTO t_brand (`name`, image, letter) VALUES ('小米', 'https://s02.mifile.cn/assets/static/image/logo-mi2.png', 'X');
INSERT INTO t_brand (`name`, image, letter) VALUES ('苹果', 'https://dss2.baidu.com/6ONYsjip0QIZ8tyhnq/it/u=3652116195,1176156622&fm=84&app=100&f=JPEG?w=255&h=255', 'P');
INSERT INTO t_brand (`name`, image, letter) VALUES ('华为', 'https://www.huawei.com//cnwww-file.huawei.com/-/media/corporate/images/home/logo/huawei_logo.png', 'H');
INSERT INTO t_brand (`name`, image, letter) VALUES ('酷派', 'https://www.coolpad.com/static/img/logo-white.91219c3.png', 'K');
INSERT INTO t_brand (`name`, image, letter) VALUES ('魅族', 'https://pics3.baidu.com/feed/4d086e061d950a7be8f6e190f25cc7dff3d3c93c.png?token=7a361d9272d74ef86d7a84dbf413c205', 'M');
商品分类表

商品分类表E-R图如下

商品分类表E-R图

思考,为什么要这么设计?

  1. 观察京东、天猫、苏宁等电商购物网站,发现分类大多为三级分类。那我们可不可以设计三个字段为布尔类型,分别代表三级目录?答案肯定是不行的,第一表结构混乱,第二后期产品可能会发生更改,改成二级、四级都有可能。产品快做完了要改动数据库,这可太糟糕了。
  2. 我们设置父节点ID,父节点ID代表“我”的上一级是谁。那么一级目录怎样表示?答案:父节点ID为0代表一级目录,因为一般情况下主键都是正整数。
  3. 排名指数相当于搜索的权重,指数越低,搜索的结果越靠上,用后端的话来说就是遍历时对排名指数进行排序。
  4. 给字段加上索引,一般情况下是我们需要根据该字段查询数据,作用是优化整体查询速度。

建表语句如下:

CREATE TABLE `t_category` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `name` varchar(200) NOT NULL COMMENT '分类名称',
  `parent_id` int(11) unsigned zerofill NOT NULL DEFAULT '00000000000' COMMENT '父节点ID',
  `sort` int(11) DEFAULT NULL COMMENT '排名指数',
  PRIMARY KEY (`id`),
  KEY `idx_parent_id` (`parent_id`),
  KEY `idx_sort` (`sort`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品分类表';

我们模仿这个页面填充数据[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J4np5IOu-1626746846641)(https://xk857.com/typora/2021/05image-20210719150558174.png)]

INSERT INTO t_category (`name`, `parent_id`, `sort`) VALUES ('手机/数码/配件', 0, 1);
INSERT INTO t_category (`name`, `parent_id`, `sort`) VALUES ('电脑/办公/外设', 0, 2);
INSERT INTO t_category (`name`, `parent_id`, `sort`) VALUES ('厨卫电器 生活电器', 0, 3);
INSERT INTO t_category (`name`, `parent_id`, `sort`) VALUES ('手机通讯', 1, 1);
INSERT INTO t_category (`name`, `parent_id`, `sort`) VALUES ('手机配件', 1, 2);
INSERT INTO t_category (`name`, `parent_id`, `sort`) VALUES ('运营商', 1, 3);
INSERT INTO t_category (`name`, `parent_id`, `sort`) VALUES ('摄影摄像', 1, 4);
INSERT INTO t_category (`name`, `parent_id`, `sort`) VALUES ('数码配件', 1, 5);
INSERT INTO t_category (`name`, `parent_id`, `sort`) VALUES ('智能设备', 1, 6);
INSERT INTO t_category (`name`, `parent_id`, `sort`) VALUES ('手机', 4, 1);
INSERT INTO t_category (`name`, `parent_id`, `sort`) VALUES ('移动电源', 5, 1);
INSERT INTO t_category (`name`, `parent_id`, `sort`) VALUES ('手机耳机', 5, 2);
INSERT INTO t_category (`name`, `parent_id`, `sort`) VALUES ('蓝牙耳机', 5, 3);
INSERT INTO t_category (`name`, `parent_id`, `sort`) VALUES ('保护壳/套', 5, 4);
INSERT INTO t_category (`name`, `parent_id`, `sort`) VALUES ('手机存储卡', 5, 5);
INSERT INTO t_category (`name`, `parent_id`, `sort`) VALUES ('手机贴膜', 5, 6);
INSERT INTO t_category (`name`, `parent_id`, `sort`) VALUES ('手机电池', 5, 7);
INSERT INTO t_category (`name`, `parent_id`, `sort`) VALUES ('合约购机', 6, 1);
INSERT INTO t_category (`name`, `parent_id`, `sort`) VALUES ('办手机卡', 6, 2);
INSERT INTO t_category (`name`, `parent_id`, `sort`) VALUES ('装宽带', 6, 3);
INSERT INTO t_category (`name`, `parent_id`, `sort`) VALUES ('单反相机', 7, 1);
INSERT INTO t_category (`name`, `parent_id`, `sort`) VALUES ('数码相机', 7, 2);
INSERT INTO t_category (`name`, `parent_id`, `sort`) VALUES ('摄像机', 7, 3);
INSERT INTO t_category (`name`, `parent_id`, `sort`) VALUES ('拍立得', 7, 4);
INSERT INTO t_category (`name`, `parent_id`, `sort`) VALUES ('镜头', 7, 5);
INSERT INTO t_category (`name`, `parent_id`, `sort`) VALUES ('航拍摄像', 7, 6);
INSERT INTO t_category (`name`, `parent_id`, `sort`) VALUES ('运动相机', 7, 7);
INSERT INTO t_category (`name`, `parent_id`, `sort`) VALUES ('数码相框', 7, 8);
INSERT INTO t_category (`name`, `parent_id`, `sort`) VALUES ('电脑整机', 2, 1);
INSERT INTO t_category (`name`, `parent_id`, `sort`) VALUES ('DIY硬件', 2, 2);
INSERT INTO t_category (`name`, `parent_id`, `sort`) VALUES ('存储设备', 2, 3);
INSERT INTO t_category (`name`, `parent_id`, `sort`) VALUES ('电脑外设', 2, 4);
INSERT INTO t_category (`name`, `parent_id`, `sort`) VALUES ('办公打印', 2, 5);
INSERT INTO t_category (`name`, `parent_id`, `sort`) VALUES ('笔记本', 29, 1);
INSERT INTO t_category (`name`, `parent_id`, `sort`) VALUES ('平板电脑', 29, 2);



分类品牌关系表

分类与品牌表关系,一个品牌有多个分类,一个分类也可以有多个品牌,因此是多对多关系。注意主键是复合关系。

CREATE TABLE `t_category_brand` (
  `category_id` int(11) NOT NULL COMMENT '分类id',
  `brand_id` int(11) NOT NULL COMMENT '品牌id',
  PRIMARY KEY (`category_id`,`brand_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='分类品牌关系表';

分类数据填充

INSERT INTO t_category_brand (`category_id`, `brand_id`) VALUES (10, 1);
INSERT INTO t_category_brand (`category_id`, `brand_id`) VALUES (10, 2);
INSERT INTO t_category_brand (`category_id`, `brand_id`) VALUES (10, 3);
INSERT INTO t_category_brand (`category_id`, `brand_id`) VALUES (10, 4);
INSERT INTO t_category_brand (`category_id`, `brand_id`) VALUES (10, 5);
INSERT INTO t_category_brand (`category_id`, `brand_id`) VALUES (10, 6);
INSERT INTO t_category_brand (`category_id`, `brand_id`) VALUES (10, 7);
INSERT INTO t_category_brand (`category_id`, `brand_id`) VALUES (10, 8);
INSERT INTO t_category_brand (`category_id`, `brand_id`) VALUES (10, 9);
INSERT INTO t_category_brand (`category_id`, `brand_id`) VALUES (10, 10);



产品表和商品表

上面写了那么多其实都是为了产品表和商品表做铺垫的,先来看一下产品表的E-R图

产品表E-R图

建表语句

CREATE TABLE `t_spu` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `title` varchar(200) NOT NULL COMMENT '标题',
  `sub_title` varchar(200) DEFAULT NULL COMMENT '副标题',
  `category_id` int(10) unsigned NOT NULL COMMENT '分类ID',
  `brand_id` int(10) unsigned DEFAULT NULL COMMENT '品牌ID',
  `spg_id` int(10) unsigned NOT NULL COMMENT '品类ID',
  `saleable` tinyint(1) NOT NULL COMMENT '是否上架',
  `valid` tinyint(1) NOT NULL COMMENT '是否删除',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
  `last_update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后更新时间',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `idx_brand_id` (`brand_id`) USING BTREE,
  KEY `idx_category_id` (`category_id`) USING BTREE,
  KEY `idx_spg_id` (`spg_id`) USING BTREE,
  KEY `idx_saleable` (`saleable`) USING BTREE,
  KEY `idx_valid` (`valid`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='产品表';

注意事项:

  1. valid 表示逻辑删除,之所以不使用物理删除原因很多。最主要的原因是牵连信息太多,如订单信息等,删除后影响大,数据量大时,删除是一个非常消耗性能的操作,修改要好很多。
  2. 有读者问,应该会根据标题和副标题查询商品,为什么不给标题副标题设置索引。
    答案是,后面会使用分词技术对标题副标题进行分词,这里添加索引的意义不大,通过海量查询发现,对标题副标题设置索引速度变化不大,反而会影响增删改的速度。

我们向spu表添加一条数据

INSERT INTO t_spu 
(title, sub_title, category_id, brand_id, spg_id, saleable, valid, create_time, last_update_time) 
VALUES 
('iPhone 12', '【享3期免息 用建行分期再减200】A14仿生芯片 5G速度 瓷晶面板防跌落 航空级铝金属边框超漂亮', 10, 3, 1, 1, 1, '2021-07-19 19:38:52', '2021-07-19 19:38:52');

我们来分析一下这个表中的数据:

  1. category_id:是分类表t_category中的id
  2. brand_id:是品牌表t_brand中的id
  3. spg_id:是品类表t_spec_group中的id

商品表ER图如下

商品表E-R图

商品表建表SQL语句如下

CREATE TABLE `t_sku` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `spu_id` int(10) unsigned NOT NULL COMMENT '产品ID',
  `title` varchar(200) NOT NULL COMMENT '商品标题',
  `images` json DEFAULT NULL COMMENT '商品图片',
  `price` decimal(10,2) unsigned NOT NULL COMMENT '价格',
  `param` json NOT NULL COMMENT '参数',
  `saleable` tinyint(1) NOT NULL COMMENT '是否上架',
  `valid` tinyint(1) NOT NULL COMMENT '是否有效',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
  `last_update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后修改时间',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `idx_spu_id` (`spu_id`) USING BTREE,
  KEY `idx_saleable` (`saleable`) USING BTREE,
  KEY `idx_valid` (`valid`) USING BTREE,
  FULLTEXT KEY `title` (`title`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品表';

注意事项:

  1. 价格可根据业务需求设置,可以设置平常价/打折价两个价格字段,根据业务灵活改变
  2. 价格设置成decimal类型,不可设置成浮点型,double或者float会出现精度丢失的情况

来看下sku表中的数据:

image-20210719195233494

主要是 imagesparam两个json格式是数据有疑问,我们来分析一下

// images
{
	"desc": ["http://127.0.0.1/3.jpg", "http://127.0.0.1/4.jpg"],
	"facade": ["http://127.0.0.1/1.jpg", "http://127.0.0.1/2.jpg"]
}
// param
{
	"CPU": "A14",
	"内存": 128,
	"电池": 3008,
	"运存": 8,
	"屏幕尺寸": 6.1
}

分析:

  1. images中,facade表示展示的大图,desc是商品详情页的图片
  2. param中的数据大家熟悉吗?它是参数表 t_spec_param 中的属性,我们通过品类表t_spec_group手机对应的spg_id找到 t_spec_param 中所有手机的属性,通过前后端交互转换成json数据防止到数据库中。



如何设计商品的库存?

可能有读者会问,直接设置到商品表中不就好了,加上一个字段就OK了,真的这么简单吗?

我们分析一下,我们是新零售平台,也就是说会有多个店铺,每个店铺的库存都一样吗?

此时我们抽象出新的两张表,零售店与仓库表,两者是多对多关系。有读者说多对的关系,新建一个中间表关联零售店与仓库表。

想象一下新的场景,如果仓库没有库存我们会不会从别的地方调货,因此不能单纯的使用一个中间表定死了。

我们来看一下零售店、仓库与商品表的关系:

image-20210719204139739

还有一个前提条件是创建省份和城市表,无论是零售店还是仓库都有城市信息,通过字符检索速度相对而言太慢了,尤其是在高并发的场景下还需要计算邮费等等,因此需要抽象出省份和城市表。

省份表结构和数据

CREATE TABLE `t_province`  (
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
  `province` varchar(100)  NOT NULL COMMENT '省份',
  `is_deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `unq_province`(`province`) USING BTREE
) COMMENT = '省份表';
省份数据
 
	 INSERT INTO t_province VALUES (1, '北京', 0);
     INSERT INTO t_province VALUES (2, '上海', 0);
     INSERT INTO t_province VALUES (3, '天津', 0);
     INSERT INTO t_province VALUES (4, '重庆', 0);
     INSERT INTO t_province VALUES (5, '辽宁', 0);
     INSERT INTO t_province VALUES (6, '吉林', 0);
     INSERT INTO t_province VALUES (7, '黑龙江', 0);
     INSERT INTO t_province VALUES (8, '山东', 0);
     INSERT INTO t_province VALUES (9, '江苏', 0);
     INSERT INTO t_province VALUES (10, '浙江', 0);
     INSERT INTO t_province VALUES (11, '安徽', 0);
     INSERT INTO t_province VALUES (12, '福建', 0);
     INSERT INTO t_province VALUES (13, '江西', 0);
     INSERT INTO t_province VALUES (14, '广东', 0);
     INSERT INTO t_province VALUES (15, '广西', 0);
     INSERT INTO t_province VALUES (16, '海南', 0);
     INSERT INTO t_province VALUES (17, '河南', 0);
     INSERT INTO t_province VALUES (18, '湖南', 0);
     INSERT INTO t_province VALUES (19, '湖北', 0);
     INSERT INTO t_province VALUES (20, '河北', 0);
     INSERT INTO t_province VALUES (21, '山西', 0);
     INSERT INTO t_province VALUES (22, '内蒙古', 0);
     INSERT INTO t_province VALUES (23, '宁夏', 0);
     INSERT INTO t_province VALUES (24, '青海', 0);
     INSERT INTO t_province VALUES (25, '陕西', 0);
     INSERT INTO t_province VALUES (26, '甘肃', 0);
     INSERT INTO t_province VALUES (27, '新疆', 0);
     INSERT INTO t_province VALUES (28, '四川', 0);
     INSERT INTO t_province VALUES (29, '贵州', 0);
     INSERT INTO t_province VALUES (30, '云南', 0);
     INSERT INTO t_province VALUES (31, '西藏', 0);
     INSERT INTO t_province VALUES (32, '香港', 0);
     INSERT INTO t_province VALUES (33, '澳门', 0);
     INSERT INTO t_province VALUES (34, '台湾', 0);
  

城市表结构和数据

CREATE TABLE `t_city` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `city` varchar(200) NOT NULL COMMENT '城市',
  `province_id` int(10) unsigned NOT NULL COMMENT '省份ID',
  `is_deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT '逻辑删除',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `uni_city` (`city`(191))
) ENGINE=InnoDB AUTO_INCREMENT=343 DEFAULT CHARSET=utf8mb4 COMMENT='城市表';

城市表数据



创建仓库表

CREATE TABLE `t_warehouse`  (
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
  `city_id` int(10) UNSIGNED NOT NULL COMMENT '城市ID',
  `address` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '地址',
  `tel` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '电话',
  `lng` decimal(15, 10) NULL DEFAULT NULL COMMENT '纬度',
  `lat` decimal(15, 10) NULL DEFAULT NULL COMMENT '经度',
  `is_deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除',
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `idx_city_id`(`city_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '仓库表' ROW_FORMAT = Dynamic;

仓库商品关联表

CREATE TABLE `t_warehouse_sku`  (
  `warehouse_id` int(10) UNSIGNED NOT NULL COMMENT '仓库ID',
  `sku_id` int(10) UNSIGNED NOT NULL COMMENT '商品ID',
  `num` int(10) UNSIGNED NOT NULL COMMENT '库存数量',
  `unit` varchar(20)  NOT NULL COMMENT '库存单位',
  `is_deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除',
  PRIMARY KEY (`warehouse_id`, `sku_id`) USING BTREE
) COMMENT = '仓库商品库存表';

零售店

CREATE TABLE `t_shop`  (
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
  `city_id` int(10) UNSIGNED NOT NULL COMMENT '城市ID',
  `address` varchar(200) NOT NULL COMMENT '地址',
  `tel` varchar(20) NOT NULL COMMENT '电话',
  `is_deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除',
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `idx_city_id`(`city_id`) USING BTREE
) COMMENT = '零售店表' ;

零售店与商品关联表

CREATE TABLE `t_shop_sku`  (
  `shop_id` int(10) UNSIGNED NOT NULL COMMENT '零售店ID',
  `sku_id` int(10) UNSIGNED NOT NULL COMMENT '商品ID',
  `num` int(10) UNSIGNED NOT NULL COMMENT '库存数量',
  `unit` varchar(20) NOT NULL COMMENT '库存单位',
  `is_deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除',
  PRIMARY KEY (`shop_id`, `sku_id`) USING BTREE
) COMMENT = '零售店商品库存表';



2. 客户相关表设计

设计客户表

客户表有没有会员制度? 如果有该怎样做?设计一个会员表,会员表SQL语句如下

CREATE TABLE `t_level`  (
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
  `level` varchar(200)  NOT NULL COMMENT '等级名称',
  `discount` decimal(10, 2) UNSIGNED NOT NULL COMMENT '折扣',
  PRIMARY KEY (`id`) USING BTREE
) COMMENT = '会员登记表';

此时我们再来设计客户表

CREATE TABLE `t_customer`  (
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
  `username` varchar(200) NOT NULL COMMENT '用户名',
  `password` varchar(2000) NOT NULL COMMENT '密码(加密)',
  `wechat` varchar(200) NULL DEFAULT NULL COMMENT '微信号',
  `tel` char(11) NULL DEFAULT NULL COMMENT '手机号',
  `level_id` int(10) UNSIGNED NULL DEFAULT NULL COMMENT '会员等级',
  `create_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
  `last_update_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后修改时间',
  `is_deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `unq_username`(`username`) USING BTREE,
  INDEX `idx_username`(`username`) USING BTREE
)  COMMENT = '客户表' ;

密码字段的长度之所以设计成2000,是因为不同的加密算法,加密的字符串也不相同,为了兼容各种加密算法,我们把长度设置的长一些。

客户的收货地址

CREATE TABLE t_customer_address  (
  id int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
  customer_id int(10) UNSIGNED NOT NULL COMMENT '客户ID',
  `name` varchar(20) NOT NULL COMMENT '姓名',
  tel char(11) NOT NULL COMMENT '电话',
  address varchar(200) NOT NULL COMMENT '地址',
  prime tinyint(1) NOT NULL COMMENT '默认地址',
  is_deleted tinyint(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除',
  PRIMARY KEY (id) USING BTREE,
  INDEX idx_customer_id(customer_id) USING BTREE
)  COMMENT = '客户收货地址表' ;



3.购物券与订单表

购物券表设计

分析:一个用户可领取多个购物券,因此我们最少需要设计出两张表,让购物券与用户相关联;

购物券表设计

CREATE TABLE `t_voucher`  (
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
  `deno` decimal(10, 2) UNSIGNED NOT NULL COMMENT '面值',
  `condition` decimal(10, 2) UNSIGNED NOT NULL COMMENT '订单满多少钱可以使用',
  `start_date` date NULL DEFAULT NULL COMMENT '起始日期',
  `end_date` date NULL DEFAULT NULL COMMENT '截止日期',
  `max_num` int(11) NULL DEFAULT NULL COMMENT '代金券发放最大数量',
  `is_deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除',
  PRIMARY KEY (`id`) USING BTREE
)  COMMENT = '购物券表';

客户关联购物券表

CREATE TABLE `t_voucher_customer`  (
    `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
    `voucher_id` int(10) UNSIGNED NOT NULL COMMENT '购物券ID',
    `customer_id` int(10) UNSIGNED NOT NULL COMMENT '客户ID',
    `is_deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除',
    PRIMARY KEY (`id`) USING BTREE
)  COMMENT = '客户关联购物券数据表';

订单表设计

一张订单中可以包含多个商品记录,我们可不可以用JSON存储这些商品信息?答案是否定的,因为JSON字段适合存储数据,不适合检索数据。我们可以创建两张表来解决这个问题,分别是订单表和订单明细表。

CREATE TABLE `t_order`  (
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
  `code` varchar(150) NOT NULL COMMENT '流水号',
  `type` tinyint(3) UNSIGNED NOT NULL COMMENT '订单类型:1实体销售,2网络销售',
  `shop_id` int(10) UNSIGNED NULL DEFAULT NULL COMMENT '零售店ID',
  `customer_id` int(10) UNSIGNED NULL DEFAULT NULL COMMENT '会员ID',
  `amount` decimal(10, 2) UNSIGNED NOT NULL COMMENT '总金额',
  `payment_type` tinyint(3) UNSIGNED NOT NULL COMMENT '支付方式:1借记卡,2信用卡,3微信,4支付宝,5现金',
  `status` tinyint(3) UNSIGNED NOT NULL COMMENT '状态:1未付款,2已付款,3已发货,4已签收',
  `postage` decimal(10, 2) UNSIGNED NULL DEFAULT NULL COMMENT '邮费',
  `weight` int(10) UNSIGNED NULL DEFAULT NULL COMMENT '重量(克)',
  `voucher_id` int(10) UNSIGNED NULL DEFAULT NULL COMMENT '购物券ID',
  `create_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `is_deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `unq_code`(`code`) USING BTREE,
  INDEX `idx_code`(`code`) USING BTREE,
  INDEX `idx_customer_id`(`customer_id`) USING BTREE,
  INDEX `idx_status`(`status`) USING BTREE,
  INDEX `idx_create_time`(`create_time`) USING BTREE,
  INDEX `idx_type`(`type`) USING BTREE,
  INDEX `idx_shop_id`(`shop_id`) USING BTREE
) COMMENT = '订单表';

有了id为什么还要流水号?答案是流水号可以自定义规则,例如尾号为A代表加急发货,B代表正常发货,C代表延期发货等等,业务员可以通过流水号直观的了解到订单信息。

订单详情表

CREATE TABLE `t_order_detail`  (
  `order_id` int(10) UNSIGNED NOT NULL COMMENT '订单ID',
  `sku_id` int(10) UNSIGNED NOT NULL COMMENT '商品ID',
  `price` decimal(10, 2) UNSIGNED NOT NULL COMMENT '原价格',
  `actual_price` decimal(10, 2) UNSIGNED NOT NULL COMMENT '实际购买价',
  `num` int(10) UNSIGNED NOT NULL COMMENT '购买数量',
  `is_deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除',
  PRIMARY KEY (`order_id`, `sku_id`) USING BTREE
) COMMENT = '订单详情表';



4.员工相关表设计

部门、职位与员工表

部门表建表语句

CREATE TABLE `t_dept`  (
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
  `dname` varchar(20)  NOT NULL COMMENT '部门名称',
  `is_deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `unq_dname`(`dname`) USING BTREE
)COMMENT = '部门表';

职位表

CREATE TABLE `t_job`  (
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
  `job` varchar(20) COMMENT '职位名称',
  `is_deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `unq_job`(`job`) USING BTREE
) COMMENT = '职位表';

员工表

CREATE TABLE t_emp  (
  id int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
  wid varchar(20) NOT NULL COMMENT '工号',
  ename varchar(20) NOT NULL COMMENT '姓名',
  sex char(1) NOT NULL COMMENT '性别',
  married tinyint(1) NOT NULL COMMENT '婚否',
  education tinyint(4) NOT NULL COMMENT '学历:1大专,2本科,3研究生,4博士,5其他',
  tel char(11) NOT NULL COMMENT '电话',
  email varchar(200) NULL DEFAULT NULL COMMENT '邮箱',
  address varchar(200) NULL DEFAULT NULL COMMENT '住址',
  job_id int(10) UNSIGNED NOT NULL COMMENT '职务ID',
  dept_id int(10) UNSIGNED NOT NULL COMMENT '部门ID',
  mgr_id int(10) UNSIGNED NULL DEFAULT NULL COMMENT '上司ID',
  hiredate date NOT NULL COMMENT '入职日期',
  termdate date NULL DEFAULT NULL COMMENT '离职日期',
  `status` tinyint(3) UNSIGNED NOT NULL COMMENT '状态:1在职,2休假,3离职,4死亡',
  is_deleted tinyint(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除',
  PRIMARY KEY (id) USING BTREE,
  UNIQUE INDEX unq_wid(wid) USING BTREE,
  INDEX idx_job_id(job_id) USING BTREE,
  INDEX idx_dept_id(dept_id) USING BTREE,
  INDEX idx_status(status) USING BTREE,
  INDEX idx_mgr_id(mgr_id) USING BTREE,
  INDEX idx_wid(wid) USING BTREE
) COMMENT = '员工表';

创建用户与角色表

这里为了方便角色和用户就使用一对一关系了,更加详细的划分可以在这里使用RBAC权限模型,角色表建表语句如下:

CREATE TABLE `t_role`  (
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
  `role` varchar(20) NOT NULL COMMENT '角色名称',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `unq_role`(`role`) USING BTREE
)COMMENT = '角色表';

用户表建表语句如下

CREATE TABLE t_user  (
  id int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
  username varchar(150) NOT NULL COMMENT '用户名',
  `password` varchar(2000) NOT NULL COMMENT '密码(AES加密)',
  emp_id int(10) UNSIGNED NOT NULL COMMENT '员工ID',
  role_id int(10) UNSIGNED NOT NULL COMMENT '角色ID',
  `status` tinyint(3) UNSIGNED NOT NULL COMMENT '状态:1可用,2禁用',
  create_time timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
  last_update_time timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后修改时间',
  is_deleted tinyint(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除',
  PRIMARY KEY (id) USING BTREE,
  UNIQUE INDEX unq_username(username) USING BTREE,
  INDEX idx_username(username) USING BTREE,
  INDEX idx_emp_id(emp_id) USING BTREE,
  INDEX idx_role_id(role_id) USING BTREE,
  INDEX idx_status(status) USING BTREE
) COMMENT = '用户表';



5.快递表、退货表和评价表

快递表建表语句如下

CREATE TABLE t_delivery  (
  id int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
  order_id int(10) UNSIGNED NOT NULL COMMENT '订单ID',
  sku json NOT NULL COMMENT '商品',
  qa_id int(10) UNSIGNED NOT NULL COMMENT '质检员ID',
  de_id int(10) UNSIGNED NOT NULL COMMENT '发货员ID',
  postid varchar(20) NOT NULL COMMENT '快递单号',
  price decimal(10, 0) UNSIGNED NOT NULL COMMENT '快递费',
  ecp tinyint(3) UNSIGNED NOT NULL COMMENT '快递公司编号',
  address varchar(200) NOT NULL COMMENT '收货地址',
  warehouse_id int(10) UNSIGNED NOT NULL COMMENT '仓库ID',
  create_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_order_id(order_id) USING BTREE,
  INDEX idx_qa_id(qa_id) USING BTREE,
  INDEX idx_de_id(de_id) USING BTREE,
  INDEX idx_postid(postid) USING BTREE,
  INDEX idx_warehouse_id(warehouse_id) USING BTREE,
  INDEX idx_address_id(address) USING BTREE,
  INDEX idx_ecp(ecp) USING BTREE
)COMMENT = '快递表';

退货表

CREATE TABLE t_backstock  (
  id int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
  order_id int(10) UNSIGNED NOT NULL COMMENT '订单ID',
  sku json NOT NULL COMMENT '退货商品',
  reason varchar(200) NOT NULL COMMENT '退货原因',
  qa_id int(10) UNSIGNED NOT NULL COMMENT '质检员ID',
  payment decimal(10, 2) UNSIGNED NOT NULL COMMENT '退款金额',
  payment_type tinyint(3) UNSIGNED NOT NULL COMMENT '退款方式:1借记卡,2信用卡,3微信,4支付宝,5现金',
  `status` tinyint(3) UNSIGNED NOT NULL COMMENT '状态:1退货成功,2无法退货',
  create_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_order_id(order_id) USING BTREE,
  INDEX idx_qa_id(qa_id) USING BTREE,
  INDEX idx_status(status) USING BTREE
) COMMENT = '退货表';

评价表

CREATE TABLE `t_rating`  (
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '评价ID',
  `order_id` int(10) UNSIGNED NOT NULL COMMENT '订单ID',
  `sku_id` int(10) UNSIGNED NOT NULL COMMENT '商品ID',
  `img` json NULL COMMENT '买家晒图',
  `rating` tinyint(3) UNSIGNED NOT NULL COMMENT '评分',
  `comment` varchar(200) NULL DEFAULT NULL COMMENT '评论',
  `create_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_order_id`(`order_id`) USING BTREE,
  INDEX `idx_sku_id`(`sku_id`) USING BTREE,
  INDEX `idx_create_time`(`create_time`) USING BTREE
)  COMMENT = '评价表';



6.供应商与入库表

设计供应商相关表

供应商表

CREATE TABLE t_supplier  (
    id int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
    `code` varchar(150) NOT NULL COMMENT '供货商编号',
    `name` varchar(150) NOT NULL COMMENT '供货商名称',
    type tinyint(3) UNSIGNED NOT NULL COMMENT '类型:1厂家,2代理商,3个人',
    link_man varchar(20) NOT NULL COMMENT '联系人',
    tel varchar(20) NOT NULL COMMENT '联系电话',
    address varchar(200) NOT NULL COMMENT '联系地址',
    bank_name varchar(200) NULL DEFAULT NULL COMMENT '开户银行名称',
    bank_account varchar(200) NULL DEFAULT NULL COMMENT '银行账号',
    `status` tinyint(3) UNSIGNED NOT NULL COMMENT '状态:1可用,2不可用',
    is_deleted tinyint(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除',
    PRIMARY KEY (id) USING BTREE,
    UNIQUE INDEX unq_code(code) USING BTREE,
    INDEX idx_code(code) USING BTREE,
    INDEX idx_type(type) USING BTREE,
    INDEX idx_status(status) USING BTREE
) COMMENT = '供货商表';

供货商关联商品表

CREATE TABLE t_supplier_sku  (
    supplier_id int(10) UNSIGNED NOT NULL COMMENT '供货商ID',
    sku_id int(10) UNSIGNED NOT NULL COMMENT '商品ID',
    is_deleted tinyint(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除',
    PRIMARY KEY (supplier_id, sku_id) USING BTREE
) COMMENT = '供货商关联商品表';

设计采购与入库表

采购表设计

CREATE TABLE t_purchase  (
    id int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
    sku_id int(10) UNSIGNED NOT NULL COMMENT '商品ID',
    num int(10) UNSIGNED NOT NULL COMMENT '数量',
    warehouse_id int(10) UNSIGNED NOT NULL COMMENT '仓库ID',
    in_price decimal(10, 2) UNSIGNED NOT NULL COMMENT '采购价格',
    out_price decimal(10, 2) UNSIGNED NULL DEFAULT NULL COMMENT '建议零售价',
    buyer_id int(10) UNSIGNED NOT NULL COMMENT '采购员ID',
    `status` tinyint(3) UNSIGNED NOT NULL COMMENT '状态:1未完成,2已完成',
    create_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_sku_id(sku_id) USING BTREE,
    INDEX idx_warehouse_id(warehouse_id) USING BTREE,
    INDEX idx_buyer_id(buyer_id) USING BTREE,
    INDEX idx_status(status) USING BTREE,
    INDEX idx_create_time(create_time) USING BTREE
) COMMENT = '采购表';

入库信息表

CREATE TABLE t_productin  (
    id int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
    storekeeper_id int(10) UNSIGNED NOT NULL COMMENT '保管员ID',
    amount decimal(15, 2) UNSIGNED NOT NULL COMMENT '总金额',
    supplier_id int(10) UNSIGNED NOT NULL COMMENT '供应商ID',
    payment decimal(15, 2) UNSIGNED NOT NULL COMMENT '实付金额',
    payment_type tinyint(3) UNSIGNED NOT NULL COMMENT '支付方式',
    invoice tinyint(1) NOT NULL COMMENT '是否开票',
    remark varchar(200) NULL DEFAULT NULL COMMENT '备注',
    create_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_storekeeper_id(storekeeper_id) USING BTREE,
    INDEX idx_supplier_id(supplier_id) USING BTREE,
    INDEX idx_payment_type(payment_type) USING BTREE,
    INDEX idx_create_time(create_time) USING BTREE
) COMMENT = '入库信息表';

采购入库关系表

CREATE TABLE t_productin_purchase  (
  productin_id int(10) UNSIGNED NOT NULL COMMENT '入库ID',
  purchase_id int(10) UNSIGNED NOT NULL COMMENT '采购ID',
  is_deleted tinyint(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除',
  PRIMARY KEY (productin_id, purchase_id) USING BTREE
) COMMENT = '入库商品表';
  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
购物商城的Spu-Sku数据库设计主要是为了管理商品的库存和销售信息。Spu(Standard Product Unit)是商品的标准产品单位,通常指的是一组具有相同特征但可能有不同规格的商品,例如同一款衣服的不同颜色或尺码。Sku(Stock Keeping Unit)是商品的库存管理单位,是对Spu的具体细分,用于区分不同规格或属性的商品。 在数据库设计中,可以建立两个主要的表:Spu表和Sku表。Spu表用于存储商品的基本信息,包括商品的名称、描述、品牌、分类等。此外,可以为Spu表添加一些扩展字段,例如商品的图片、销售状态等。 Sku表用于存储商品的具体规格和库存信息,其中包括Spu的外键关联、商品的属性、规格、价格和库存数量等。通过外键关联,可以将Sku与其对应的Spu关联起来,实现SpuSku的多对一关系。同时,可以在Sku表中添加一些扩展字段,例如商品的条形码、上架时间等。 为了提高查询效率,可以在Sku表中添加索引,例如根据商品的价格、库存数量、销售状态等字段进行索引,以快速获取满足条件的商品信息。 此外,为了提高系统的可维护性和可扩展性,可以添加一些辅助表,例如属性表和属性值表,用于管理商品的属性信息。属性表用于存储商品的属性名称,属性值表用于存储属性的具体取值范围。 总之,购物商城的Spu-Sku数据库设计需要考虑SpuSku之间的关联关系,以及商品的基本信息和规格信息的存储和管理。通过合理的设计和优化索引,可以提高系统的查询性能和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CV大魔王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值