作者:京东物流高峰1需求 构建一个电商通用型商品中心,可支持商品的种类和属性繁多,可以售卖实物、虚拟、会员、服务类商品。每一种商品具有不同的规格,不同的规格的商品有多种价格,商品可支持多种货币的支付。 1)目的是什么? 带大家一起实现一个通用型商品中心,从中学到一些扩展性设计思想。 2)你能学到什么?理解行业术语和概念动态sku表单设计属性和sku扩展性设计价格扩展性设计商品规格设计 3)不能学到什么?商品图片存储设计商品上下架设计商品标签设计库存设计搜索筛选设计2商品的基本概念 商品中心是电商各个系统的最基础单元,为商城、订单,优惠促销、库存、仓储物流等系统提供基础数据。 电商的基本术语。SKU:(StockKeepingUint,即库存量单位),库存控制的最小可用单位。例如iPhone7Plus128G银色就是一个SKU,仓库管理、采购进货、库存管理都是以SKU为记录单元。SPU:(StandardProductUnit,即标准化产品单元),是一组标准化信息的集合,例如iPhone7Plus就是一个SPU。类目:即分类树。电商常用的有两层类目:前台展示类目和后端商品类目。 前台类目指的是展示给消费者看的类目,会根据季节、销售策略、活动进行变动; 后台类目属于基础数据,不可随意变动,添加SKU时都需要选择后台类目,进行绑定。属性:分为关键属性、销售属性、非关键属性、特殊属性。关键属性是指能够唯一确定产品的属性,是必填项,例如手机的屏幕尺寸、型号属于关键属性。销售属性是组成SKU的特殊属性,或称为规格属性,例如手机的颜色、内存。非关键属性指的是除关键属性、销售属性外的其他属性,如前置摄象头像素、后置摄像头像素、产地、分辨率。特殊属性指需要通过调用其他服务才能获取到的属性。3商品架构图 参考下面的商品组成模块图,商品模块的组成较为复杂,在定义SKU与SPU时,涉及类目、属性、品牌、生产信息等数据的组合,在定义出SKU后再创建SPU,在SPU上添加商品描述和规格最后就成了商品。根据商品又衍生出了价格管理、评论管理、搜索筛选等模块。3。1商品组成模块图 3。2商品中心核心ER图 3。3商品中心整体架构图 4商品类目4。1类目管理 商品类目分为两层:基础数据类目层(后台类目)、前台展示类目层(前台类目)。那为什么要将前、后台类目分开管理,而不是前、后台共用一套类目呢? 后台类目面向商家或供应链人员,商品属性、销售属性及品牌等很多数据都是在基础类目上进行管理; 前台类目面向用户,方便用户查找商品,还可以随着运营需要去调整。比如而且随着节日、时令季节变化,运营会经常变更前台类目。4。2后台类目 后台类目主要面向平台运营人员或商家,用于管理商品、属性和品牌等数据。 后台类目相对固定,确定了之后不会轻易变更或删除,如果类目下挂载有商品,就不能删除或作废。 类目树的层次不能太深,一般三层或四层。如果太深,对于商品的管理不太方便。类目树中最后一层类目称为叶子类目,商品必须挂载于叶子类目下。 4。3前台类目 前台类目主要面向用户,方便用户筛选查找商品,如图图所示。 前台类目可以根据运营需要,灵活多变。所以处理商品的前端类目时,就应该提供多样化的前端类目来支持。 前台类目可支持不同客户端的设置。PC端、H5端、APP端等 前台类目不同于固定的后台类目,编辑很灵活、可重叠、可删除、可随时变动,定时生效。 4。4类目表结构设计4。1。1后端类目表设计CREATETABLEcategory(idbigint(11)unsignedNOTNULLAUTOINCREMENTCOMMENTid,namevarchar(32)NOTNULLCOMMENT类目名称,parentidbigint(11)NOTNULLCOMMENT父id,leaftinyint(4)NOTNULLCOMMENT是否叶子节点1是0不是,leveltinyint(4)NOTNULLCOMMENT类目层级,pathvarchar(128)DEFAULTNULLCOMMENT完整父级路径:父父id父id,sortint(11)unsignedNOTNULLCOMMENT排序字段,statustinyint(4)NOTNULLCOMMENT分类状态:1上架2下架,deltinyint(4)unsignedNOTNULLCOMMENT是否删除,createtimedatetimeNOTNULLDEFAULTCURRENTTIMESTAMPCOMMENT创建时间,updatetimedatetimeNOTNULLDEFAULTCURRENTTIMESTAMPCOMMENT更新时间,PRIMARYKEY(id)USINGBTREE)ENGINEInnoDBDEFAULTCHARSETutf8mb4COMMENT类目表;4。4。2后端类目数据展示 5SKU SKU算是电商中最基础的概念,SKU是最小库存单元。 以iPhone8Plus(SPU)为例,这个SPU的规格有多种(颜色包含金色、白色、黑色、玫瑰金、银色、亮黑、红色等6种;内存包含32G、128G、256G等3种),对应18(即36)种SKU。比如iPhone7Plus白色32G、iPhone7Plus黑色32G这两个SKU都能具化到实物。仓库系统、采购系统、库存系统等系统都是主要管理SKU。5。1sku表设计CREATETABLEsku(idint(11)NOTNULLAUTOINCREMENT,skunovarchar(32)DEFAULTCOMMENT商品序列号,skunamevarchar(50)DEFAULTNULLCOMMENT商品名称,skudescriptionvarchar(256)DEFAULTNULLCOMMENT商品描述,skutypetinyint(4)DEFAULTNULLCOMMENT商品类型:1实物商品、2会员商品、3增值商品,4虚拟物品,statustinyint(4)NOTNULLCOMMENT状态1未上架2。已上架3。已下架,sortint(10)DEFAULT0COMMENT排序,boundletinyint(4)unsignedDEFAULT0COMMENT是否组合商品1是0否,createbyint(11)unsignedNOTNULLCOMMENT创建人ID,updatebyint(11)unsignedDEFAULTNULLCOMMENT修改人ID,createtimetimestampNOTNULLDEFAULTCURRENTTIMESTAMPCOMMENT创建时间,updatetimetimestampNULLDEFAULTNULLONUPDATECURRENTTIMESTAMPCOMMENT更新时间,PRIMARYKEY(id)USINGBTREE,UNIQUEKEYukskuno(skuno)USINGBTREE)ENGINEInnoDBAUTOINCREMENT1DEFAULTCHARSETutf8mb4COMMENT商品表5。2sku表数据 5。3sku属性表 扩展性1:动态无限制创建属性数量。CREATETABLEskuattr(idint(11)NOTNULLAUTOINCREMENT,skunovarchar(32)DEFAULTCOMMENT商品序列号,skuattrsjsonDEFAULTNULLCOMMENTsku属性(商品属性),createtimetimestampNOTNULLDEFAULTCURRENTTIMESTAMPCOMMENT创建时间,updatetimetimestampNULLDEFAULTNULLONUPDATECURRENTTIMESTAMPCOMMENT更新时间,PRIMARYKEY(id)USINGBTREE,UNIQUEKEYukskuno(skuno)USINGBTREE)ENGINEInnoDBAUTOINCREMENT1DEFAULTCHARSETutf8mb4COMMENT商品属性表5。4sku属性数据 不创建新字段,还可以用sql查询,你得到了什么启发?5。5sku动态表单 扩展性2:根据不同类目加载不同属性渲染动态表单。 将一组属性挂载到类目来实现动态表单,你得到了什么启发?5。6商品类目关联CREATETABLEcategorytogoods(idbigint(11)unsignedNOTNULLAUTOINCREMENTCOMMENTid,categoryidbigint(20)DEFAULTNULLCOMMENT类目id,goodsnovarchar(32)DEFAULTNULLCOMMENT商品编号,goodstypetinyint(4)DEFAULTNULLCOMMENT商品类型:1sku、2spu,createtimedatetimeDEFAULTCURRENTTIMESTAMPCOMMENT创建时间,updatetimedatetimeDEFAULTCURRENTTIMESTAMPCOMMENT更新时间,isdeletedtinyint(4)unsignedNOTNULLDEFAULT0COMMENT是否删除:0否,1是,PRIMARYKEY(id)USINGBTREE)ENGINEInnoDBAUTOINCREMENT8DEFAULTCHARSETutf8mb4COMMENT类目商品关联表;5。7组合sku关系表CREATETABLEbundletosku(idbigint(11)unsignedNOTNULLAUTOINCREMENTCOMMENTid,goodsidbigint(20)DEFAULTNULLCOMMENT商品id,组合商品id,bundleidbigint(20)DEFAULTNULLCOMMENT组合商品id,quantityint(11)DEFAULTNULLCOMMENT商品数量,entitytypetinyint(4)DEFAULT1COMMENT商品的类型:1sku,2组合商品,createtimedatetimeDEFAULTCURRENTTIMESTAMPCOMMENT创建时间,updatetimedatetimeDEFAULTCURRENTTIMESTAMPCOMMENT更新时间,isdeletedtinyint(1)unsignedNOTNULLDEFAULT0COMMENT是否删除:0否,1是,PRIMARYKEY(id)USINGBTREE,KEYidxbundletogoodsbundleidindex(bundleid)USINGBTREE,KEYidxbundletogoodsobjectidentitytypeindex(objectid,entitytype)USINGBTREE)ENGINEInnoDBDEFAULTCHARSETutf8mb4COMMENT套装和sku关联表套装和spu关联表;5。8组合sku关系数据 sku数据 5。9创建组合商品表单 6属性6。1属性管理 为了方便商品管理,我们需要在系统中建立一套属性库。在定义一个属性时,需要挂载在类目下,区分属性分类(关键属性、销售属性、非关键属性、特殊属性),并确定属性值、显示类型(单选、多选、可自定义)、是否必填。 6。2属性的应用场景添加商品时候的商品表单渲染。在添加商品时,可通过选择叶子类目,将挂载到叶子类目的属性渲染到表单上。在客户端对可根据不同的属性进行搜索、筛选商品。在spu页面用户可利用商品规格(销售属性)来定位出不同的sku。商品详情页面可展示出后台配置的属性参数数据。 6。3属性表设计CREATETABLEattribute(idbigint(11)unsignedNOTNULLAUTOINCREMENTCOMMENTid,namevarchar(32)NOTNULLDEFAULTCOMMENT属性名称,codevarchar(32)DEFAULTNULLCOMMENT属性代码(非必填),attrtypetinyint(4)NOTNULLCOMMENT属性应用:1商品属性,2销售属性,3特殊属性,valuetypetinyint(4)DEFAULTNULLCOMMENT属性值类型:1:字符串,2:数字,filltypetinyint(4)NOTNULLCOMMENT填写类型:1填写型(字符),2填写型(仅整数数字),3选择型(单选值,非id)4选择型(多选值,非id),5多输入框展示型,isfiltertinyint(4)unsignedNOTNULLCOMMENT是否支持前台筛选:0否1是,statustinyint(11)NOTNULLCOMMENT状态:1未上架2已上架3已下架,isdeletedtinyint(4)unsignedNOTNULLCOMMENT是否删除,createtimedatetimeNOTNULLDEFAULTCURRENTTIMESTAMPCOMMENT创建时间,updatetimedatetimeNOTNULLDEFAULTCURRENTTIMESTAMPCOMMENT修改时间,PRIMARYKEY(id))ENGINEInnoDBAUTOINCREMENT7DEFAULTCHARSETutf8mb4COMMENT属性表;6。4属性表数据 6。5属性枚举表设计CREATETABLEattributeenum(idbigint(11)unsignedNOTNULLAUTOINCREMENTCOMMENTid,attridbigint(20)NOTNULLCOMMENT属性id,attrcodevarchar(32)DEFAULTNULL,enumcodebigint(11)DEFAULTNULLCOMMENTenumcode,enumvaluevarchar(32)NOTNULLCOMMENT属性枚举值名称,sortint(11)NOTNULLCOMMENT排序,createtimedatetimeNOTNULLDEFAULTCURRENTTIMESTAMPCOMMENT创建时间,updatetimedatetimeNOTNULLDEFAULTCURRENTTIMESTAMPCOMMENT更新时间,PRIMARYKEY(id)USINGBTREE)ENGINEInnoDBDEFAULTCHARSETutf8mb4COMMENT属性枚举表;6。6属性枚举表数据 6。7属性和类目关联表设计CREATETABLEcategorytoattr(idbigint(11)unsignedNOTNULLAUTOINCREMENTCOMMENTid,categoryidbigint(11)NOTNULLCOMMENT分类id,attridbigint(20)NOTNULLCOMMENT属性id,isrequiredtinyint(4)unsignedNOTNULLCOMMENT是否必填,createtimedatetimeNOTNULLDEFAULTCURRENTTIMESTAMPCOMMENT创建时间,updatetimedatetimeNOTNULLDEFAULTCURRENTTIMESTAMPCOMMENT更新时间,PRIMARYKEY(id)USINGBTREE)ENGINEInnoDBDEFAULTCHARSETutf8mb4COMMENT分类属性关联表;6。8动态生成属性表单 当属性库搭建完成后,就会被各个叶子类目调用,添加商品时就需要填写这些属性,商品就有了载体,如图所示。 根据这些属性便能确定商品的唯一性(SKU)。淘宝的商品属性(类目男装风衣)特别需要注意的是一些规格属性(如颜色、尺码等)。很多产品有多规格,例如衣服、鞋子等。以一双男鞋为例,有颜色(假设白、红、黑3种颜色),有尺码(从3944共6种尺码),那么这个SPU(男鞋)下面就有18个SKU。这些SKU的属性除了规格属性外,其他属性都是一致的,所以在新建商品时,可聚合到一起,共用其他属性。7SPU7。1SPU概念 SPU是标准化产品单元。SPU与SKU的关系有许多种,可以一对多、一对一,绝大部分SPU与SKU都是一对一,多规格的SPU和SKU之间是通过规格属性来连接的。SPU的库存是由其对应的SKU库存共同决定的。 以iPhone11(SPU)为例,这个SPU的规格有多种(颜色包含白色、黑色、黄金、紫色、绿色、红色等6种;内存包含32G、128G、256G等3种),对应18(即36)种SKU。比如iPhone11白色64G、iPhone11黑色64G这两个SKU都能具化到实物。仓库系统、采购系统、库存系统等系统都是主要管理SKU。在日常运营中也很常见一个SKU对应多个SPU。 7。2SPU和规格设计CREATETABLEspu(idbigint(20)unsignedNOTNULLAUTOINCREMENTCOMMENTid,namevarchar(64)DEFAULTNULLCOMMENTspu名称,detailvarchar(256)DEFAULTNULLCOMMENT商品介绍,statustinyint(4)DEFAULTNULLCOMMENT状态1未上架2。已上架2。已下架,spuspecsjsonDEFAULTNULLCOMMENT商品规格,creatoridbigint(20)DEFAULTNULLCOMMENT创建者,isdeletedtinyint(1)unsignedDEFAULT0COMMENT是否删除,0:未删除1:已删除,sortint(10)DEFAULT0COMMENT排序,createtimedatetimeDEFAULTCURRENTTIMESTAMPCOMMENT创建时间,updatetimedatetimeDEFAULTCURRENTTIMESTAMPCOMMENT更新时间,PRIMARYKEY(id)USINGBTREE)ENGINEInnoDBDEFAULTCHARSETutf8mb4COMMENTspu;7。3SPU和规格数据 sku属性数据 spu表单图片 7。4spu和sku关联表CREATETABLEsputosku(idbigint(11)unsignedNOTNULLAUTOINCREMENTCOMMENTid,skunovarchar(32)NOTNULLDEFAULTCOMMENTskuid,spunovarchar(32)NOTNULLDEFAULTCOMMENTspuid,isdeletedtinyint(1)DEFAULT0COMMENT是否删除,0:未删除1:已删除,createtimedatetimeDEFAULTCURRENTTIMESTAMPCOMMENT创建时间,updatetimedatetimeDEFAULTCURRENTTIMESTAMPCOMMENT更新时间,PRIMARYKEY(id)USINGBTREE,KEYidxsputosku(spuno,skuno)USINGBTREE)ENGINEInnoDBAUTOINCREMENT5DEFAULTCHARSETutf8mb4COMMENTspu商品关联表;8价格设计 价格包括:成本价、原价、售卖价、定金、膨胀金等会随着需求的不断增加,尤其是一些在线教育等垂直行业电商对金额会有各种玩法。CREATETABLEskuprice(idbigint(11)NOTNULLAUTOINCREMENT,skuidbigint(11)unsignedNOTNULLCOMMENT商品id,skunovarchar(20)NOTNULLDEFAULTCOMMENT商品编号,skutypetinyint(4)NOTNULLCOMMENT商品类型:1单sku2组合sku,subgoodstinyint(4)NOTNULLCOMMENT是否子商品:0否1是,bundleidbigint(20)DEFAULTNULLCOMMENT组合商品id默认空,pricedecimal(10,2)NOTNULLCOMMENT价格,pricetypevarchar(32)NOTNULLCOMMENT价格类型枚举(1。商品原价REALPRICE2。售卖价SELLPRICE3。售卖底价。。。),currencytypetinyint(4)NOTNULLDEFAULT1COMMENT货币类型:1人民币2虚拟币,enabletinyint(4)unsignedDEFAULT1COMMENT是否启用0不启用1启用,createbyint(11)unsignedNOTNULLCOMMENT创建人ID,updatebyint(11)unsignedDEFAULTNULLCOMMENT修改人ID,createtimetimestampNOTNULLDEFAULTCURRENTTIMESTAMPCOMMENT创建时间,updatetimetimestampNULLDEFAULTNULLONUPDATECURRENTTIMESTAMPCOMMENT更新时间,PRIMARYKEY(id)USINGBTREE,KEYidxskuid(skuid)USINGBTREE,KEYidxskuno(skuno)USINGBTREE)ENGINEInnoDBAUTOINCREMENT1DEFAULTCHARSETutf8mb4COMMENT商品价格表 扩展性3:不创建新字段,同一个商品可支持多种价格和货币种类9总结 本文详细介绍了商品中心设计扩展性设计思想,并在设计方面做了各维度分析。 扩展性总结如下: 动态无限制创建属性数量。 根据不同类目加载不同属性渲染动态表单。 不创建新字段,同一个商品可支持多种价格和货币种类。 希望自己总结的扩展性思想可以让大家在开发过程中有所启发。