电商系统设计之商品 (上)

电商大伙每天都在用,类似某猫,某狗等。
电商系统设计看似复杂又很简单,看似简单又很复杂
本章适合初级工程师及中级工程师细看,大佬请随意

前言

商品的设计是电商系统中占据重要地位,如何设计出高扩展,高性能的商品系统并非一件简单的事情,我的设计是观摩互联网各大佬的设计后自行研究的,并非完全正确,但也不完全错误,现在我设计的这套电商系统已经在使用,如果在逻辑上遇到什么问题,会及时修改我关于电商系统相关文章的设计思想部分。

元素


见上图,本次我们先讲解下系统规格与自定义规格、系统属性与自定义属性的关于及其他们存在的意义。

SPU

SPU(Standard Product Unit)标准化产品单元

什么叫标准化产品单元?

抛弃标准化一词来看,产品单元?就是以一个产品为一个单位。例如你是手记销售商,你在厂家进货的时候说我要iphonex 100部型号随意规格随意,进货的时候没考虑到内存或者屏幕尺寸,这个时候你就把iphonex这个商品当作一个单位。这就是产品单位。再谈标准化,只是一些人或一个人制定的这么一个标准,所以称为标准化产品单元,不要拿百度百科上的解释反驳我,我只是用更通俗易懂的方式解释一下SPU。

例如iphonex的价格也不同的地方,分别为iphonex 64g 是8888,iphonex 256g是18888。这个时候我们不能建立2个spu去管理这2个商品。这个时候就需要用到spu的概念了。

SKU

SKU(Stock Keeping Unit)库存量单元

什么叫库存量单位?

字面意思来看,库存则是指的某个商品的某个规格还有多少件,这个时候就不能只针对商品了。上面的例子iphonex有2个不同规格的商品,这个时候无法计算其每个规格的库存(创建2个商品可是不切实际,未来管理会很复杂,就例如安踏的跑鞋有十几个尺码,难道要创建十几个商品吗?),此时只能针对当前商品再创建子商品,我们叫它规格,例如iphonex 有 存储和颜色2个规格

有木有发现还是有点问题?那具体的存储大小与具体颜色该如何表达呢?这个时候需要创建规格的子商品,我们称他为属性

这个每个属性的结合则就是一个新的商品,我们称它为SKU,一个SPU对应着N个SKU

这样就生成了N个商品

  • iphonex 64G白色
  • iphonex 32G黑色
  • iphonex 256G白色 等等…

系统规格/属性

为什么要设立系统规格属性呢?

盗用一张淘宝的图,以上都是根据分类品牌设定好的规格及属性

主要是为了方便商家添加商品及其对商品的规格属性进行统一的管理,当然一个电商系统在前期运营的情况下尽量减少系统属性规格的使用(方便商家入住嘛)。

自定义属性就不用说了。不让商家添加自己的规格和尺码什么的怎么能行?

数据

具体数据表的设计如下

product

商品表 (spu表)

CREATE TABLE `product` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '商品标题',
  `category_id` int(11) NOT NULL COMMENT '商品分类编号',
  `mer_id` int(11) NOT NULL COMMENT '商家编号',
  `freight_id` int(11) DEFAULT NULL,
  `type_id` tinyint(4) NOT NULL COMMENT '类型编号',
  `sketch` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '简述',
  `intro` text COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '商品描述',
  `keywords` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '商品关键字',
  `tags` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '标签',
  `marque` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '商品型号',
  `barcode` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '仓库条码',
  `brand_id` int(11) NOT NULL COMMENT '品牌编号',
  `virtual` int(11) NOT NULL DEFAULT '0' COMMENT '虚拟购买量',
  `price` decimal(8,2) NOT NULL COMMENT '商品价格',
  `market_price` decimal(8,2) NOT NULL COMMENT '市场价格',
  `integral` int(11) NOT NULL DEFAULT '0' COMMENT '可使用积分抵消',
  `stock` int(11) NOT NULL COMMENT '库存量',
  `warning_stock` int(11) NOT NULL COMMENT '库存警告',
  `picture_url` varchar(125) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '封面图',
  `posters` varchar(125) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `status` tinyint(4) NOT NULL COMMENT '状态 -1=>下架,1=>上架,2=>预售,0=>未上架',
  `state` tinyint(4) NOT NULL DEFAULT '0' COMMENT '审核状态 -1 审核失败 0 未审核 1 审核成功',
  `is_package` enum('0','1') COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '是否是套餐',
  `is_integral` enum('0','1') COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '是否是积分产品',
  `sort` int(11) NOT NULL DEFAULT '99' COMMENT '排序',
  `deleted_at` timestamp NULL DEFAULT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

system_attribute

系统规格表

CREATE TABLE `system_attribute` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `category_id` int(11) NOT NULL COMMENT '商品类别编号',
  `name` varchar(25) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '属性名称',
  `sort` int(11) NOT NULL DEFAULT '999' COMMENT '排列次序',
  PRIMARY KEY (`id`),
  KEY `product_attribute_category_id_name_index` (`category_id`,`name`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

system_attribute_option

系统属性表

CREATE TABLE `product_attribute_option` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(125) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '选项名称',
  `attr_id` int(11) NOT NULL COMMENT '属性编码',
  `sort` int(11) NOT NULL DEFAULT '999' COMMENT '排序',
  PRIMARY KEY (`id`),
  KEY `product_attribute_option_name_attr_id_index` (`name`,`attr_id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

product_attribute_and_option

规格属性绑定表

CREATE TABLE `product_attribute_and_option` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `sku_id` int(11) NOT NULL COMMENT 'sku编码',
  `option_id` int(11) NOT NULL DEFAULT '0' COMMENT '属性选项编码',
  `attribute_id` int(11) NOT NULL COMMENT '属性编码',
  `sort` int(11) NOT NULL DEFAULT '999' COMMENT '排序',
  `supplier_option_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `product_attribute_and_option_sku_id_option_id_attribute_id_index` (`sku_id`,`option_id`,`attribute_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6335 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

product_sku

sku表

CREATE TABLE `product_sku` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `product_id` int(11) NOT NULL COMMENT '商品编码',
  `name` varchar(125) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'sku名称',
  `img` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '主图',
  `price` decimal(8,2) NOT NULL COMMENT '价格',
  `stock` int(11) NOT NULL DEFAULT '0' COMMENT '库存',
  `code` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '商品编码',
  `barcode` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '商品条形码',
  `data` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'sku串',
  PRIMARY KEY (`id`),
  KEY `product_sku_name_product_id_index` (`name`,`product_id`)
) ENGINE=InnoDB AUTO_INCREMENT=530 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

product_attribute

自定义规格表

CREATE TABLE `product_attribute` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `product_id` int(11) NOT NULL COMMENT '商品编码',
  `name` varchar(125) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '规格名称',
  `sort` int(11) NOT NULL DEFAULT '999' COMMENT '排序',
  PRIMARY KEY (`id`),
  KEY `product_supplier_attribute_name_product_id_index` (`name`,`product_id`)
) ENGINE=InnoDB AUTO_INCREMENT=40 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

致谢

其实在商品的设计层面看懂后还是很简单的,后续文章主要讲解的更多的是这些数据该如何存储更合理。如果设计不合理例如商品添加很简单,但是修改商品就很复杂。在前期设计上我们要尽量避免这些“坑”

谢谢你看到这里,希望我的文章能够帮助到你。有什么问题可以在评论区留言,我看到会第一时间回复。谢谢

最后修改:1年前
如果觉得我的文章对你有用,请随意赞赏

共有 1 条评论

  1. ertx 游客

    请问您是怎么考虑处理多个sku的问题呢?
    请问有没有一些方案?