1. 电商商品模块的“灵魂”:为什么SPU和SKU是核心?
做了这么多年电商项目,从早期的单商户小店到后来的大型平台,我踩过最多的坑,几乎都集中在商品模块。尤其是当老板说“我们这款手机有6种颜色、4种内存、3种网络版本,你给我在后台配一下”的时候,如果数据库设计得不好,那简直就是一场灾难。你可能遇到过这种情况:后台添加一个商品,要填几十个表单;前端用户选个规格,页面卡半天;库存稍微一变动,数据就对不上。这些问题,十有八九都出在商品模型的设计上,而SPU和SKU,正是解决这些问题的“定海神针”。
简单来说,你可以把SPU理解为一个商品的“身份证”或“标准模板”。比如,iPhone 15 Pro Max 就是一个SPU。它定义了这款手机最核心、不变的信息:商品名称、主图、详情描述、品牌、所属分类等。无论它是256GB的黑色版还是1TB的蓝色版,这些基础信息都是一样的。而SKU则是这个商品的具体“现货”。比如,“iPhone 15 Pro Max,黑色,256GB”就是一个独立的SKU。它拥有自己独特的身份:独立的库存、独立的价格、独立的条形码。用户最终购买和仓库实际发货的,都是某一个具体的SKU。
为什么这种设计如此重要?想象一下,如果没有SKU的概念,你把“黑色256GB”和“蓝色1TB”的价格、库存都混在同一个商品记录里,那库存扣减就会乱套,促销活动也无法针对特定规格设置。这种从“抽象模板”到“具体现货”的层级关系,是电商系统处理复杂商品、实现精细化运营的基石。接下来,我们就从最基础的数据库表开始,一层层拆解这个架构是如何搭建起来的。
2. 打好地基:商品分类与属性体系的构建
在动手设计goods(SPU)和goods_specs(SKU)表之前,我们必须先搭建好支撑它们的“基础设施”。这就像盖房子,得先有稳固的地基和框架。这个地基,就是分类体系和属性体系。很多新手开发者一上来就直奔主题建商品表,结果后期扩展起来束手束脚,就是因为忽略了这关键的一步。
2.1 分类表:管理海量商品的“文件夹”
商品成千上万,没有分类就像把一堆文件胡乱扔在桌面上,找起来会疯掉。分类表category的作用就是创建一个个有序的“文件夹”。通常我们会设计成支持无限层级的树状结构,这在实际项目中非常实用。
CREATE TABLE `category` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`parent_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '父级分类ID,0表示顶级分类',
`category_name` varchar(100) NOT NULL COMMENT '分类名称',
`level` tinyint(3) unsigned NOT NULL DEFAULT '1' COMMENT '分类层级,方便查询',
`sort_order` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '排序字段',
`is_show` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '是否显示',
PRIMARY KEY (`id`),
KEY `idx_parent_id` (`parent_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品分类表';
我在这里做了几个关键优化:一是增加了level字段,记录当前分类是第几级,这在做面包屑导航或者权限控制(比如只允许在三级分类下添加商品)时非常高效,避免每次都递归查询。二是sort_order字段,让运营同学可以手动拖拽调整分类在前端的显示顺序。三是使用utf8mb4字符集,避免以后存储emoji表情或某些生僻字时出现问题。parent_id为0就代表它是根分类,比如“数码家电”;其子分类可以是“手机通讯”,孙子分类可以是“智能手机”。通过这种设计,我们可以清晰地管理像“数码家电 > 手机通讯 > 智能手机 > 苹果手机”这样的路径。
2.2 属性体系:定义商品的“基因”
分类解决了商品“放在哪”的问题,属性则解决了商品“长什么样”的问题。属性是规格的源头。这里有一个非常重要的设计原则:将属性名(Key)和属性值(Value)分开存储。这是数据库第三范式的要求,能极大消除数据冗余,也让管理变得更灵活。
属性名表 attribute_


3万+

被折叠的 条评论
为什么被折叠?



