商品SKU功能设计与优化

151 篇文章 156 订阅
订阅专栏

原来的商品SKU设计存在着两个问题,一个是SKU表设计上面比较固化,无法扩展。另一个是当修改了商品信息之后,商品SKU的ID会发生变化,由于购物车表和订单商品表都关联了商品SKU的ID,这样就会导致匹配不上。最近对这两个问题做了点优化,下面来聊聊优化的思路。

商品的SPU和SKU

首先我们来了解下商品SPU和SKU的概念,可能很多没有接触过电商的朋友都不了解。

  • SPU(Standard Product Unit ):指的是标准商品单位,商品信息聚合的最小单位,是一组可复用、易检索的标准化信息的集合,该集合描述了一个商品的特性;

  • SKU(Stock Keeping Unit):库存量单位,是物理上不可分割的最小存货单元。

举个例子:比如说现在有个手机商品叫小米8,小米8有不同的属性,比如有它有黑色和蓝色的,有32G和64G版本的。此时小米8就是一个SPU,而小米8黑色64G就是一个SKU。

商品的SKU设计

以前的设计

商品的SKU信息是存储在pms_sku_stock表中的,使用sp1、sp2、sp3这三个属性来存储商品的销售属性,这样做很不灵活,也难以扩展。

这种做法也带来了后续的问题,比如我们的购物车和订单都会需要存储销售属性,这样的话都会需要添加sp1、sp2、sp3的属性。

改进后的设计

由于商品的销售属性是动态的,没法确定到底有多少个,此时我们可以改用JSON格式来存储,在pms_sku_stock表中添加了sp_data字段。

sp_data存储的就是一个JSON数组,比如颜色为黑色,容量为32G的手机存储信息如下。

[
    {
        "key": "颜色",
        "value": "黑色"
    },
    {
        "key": "容量",
        "value": "32G"
    }
]

这样修改以后,在原来的购物车表oms_cart_item和订单商品表oms_order_item中就都可以用JSON格式来存储销售属性了,使用的是product_attr字段。

商品关联SKU的修改

以前的做法

商品的SKU信息作为商品的关联信息,在修改商品信息时会同时进行修改。以前的做法是直接删除该商品的所有SKU信息,再重新添加。这样就会导致商品SKU中的ID被修改,由于在购物车和订单商品中关联了商品SKU的ID,就会导致原来的ID失效的问题。下面是原来修改商品中SKU信息的代码。

/**
 * 商品管理Service实现类
 * Created by macro on 2018/4/26.
 */
@Service
public class PmsProductServiceImpl implements PmsProductService {
    
        @Override
        public int update(Long id, PmsProductParam productParam) {
            //省略若干代码...
            //删除该商品关联的SKU
            PmsSkuStockExample skuStockExample = new PmsSkuStockExample();
            skuStockExample.createCriteria().andProductIdEqualTo(id);
            skuStockMapper.deleteByExample(skuStockExample);
            handleSkuStockCode(productParam.getSkuStockList(),id);
            //插入传入的所有SKU
            relateAndInsertList(skuStockDao, productParam.getSkuStockList(), id);
        }
}

改进后的做法

首先我们需要和前端约定下,新增的商品SKU信息不传ID,要修改的商品SKU信息传ID,删除的直接不传SKU信息。然后我们可以根据传入的SKU信息来确定需要新增、修改、删除的SKU信息,这样就可以做到在更新商品SKU信息时,不改变原来商品SKU的ID了,具体流程如下。

具体代码实现如下:

/**
 * 商品管理Service实现类
 * Created by macro on 2018/4/26.
 */
@Service
public class PmsProductServiceImpl implements PmsProductService {
    private void handleUpdateSkuStockList(Long id, PmsProductParam productParam) {
        //当前的sku信息
        List<PmsSkuStock> currSkuList = productParam.getSkuStockList();
        //当前没有sku直接删除
        if(CollUtil.isEmpty(currSkuList)){
            PmsSkuStockExample skuStockExample = new PmsSkuStockExample();
            skuStockExample.createCriteria().andProductIdEqualTo(id);
            skuStockMapper.deleteByExample(skuStockExample);
            return;
        }
        //获取初始sku信息
        PmsSkuStockExample skuStockExample = new PmsSkuStockExample();
        skuStockExample.createCriteria().andProductIdEqualTo(id);
        List<PmsSkuStock> oriStuList = skuStockMapper.selectByExample(skuStockExample);
        //获取新增sku信息
        List<PmsSkuStock> insertSkuList = currSkuList.stream().filter(item->item.getId()==null).collect(Collectors.toList());
        //获取需要更新的sku信息
        List<PmsSkuStock> updateSkuList = currSkuList.stream().filter(item->item.getId()!=null).collect(Collectors.toList());
        List<Long> updateSkuIds = updateSkuList.stream().map(PmsSkuStock::getId).collect(Collectors.toList());
        //获取需要删除的sku信息
        List<PmsSkuStock> removeSkuList = oriStuList.stream().filter(item-> !updateSkuIds.contains(item.getId())).collect(Collectors.toList());
        handleSkuStockCode(insertSkuList,id);
        handleSkuStockCode(updateSkuList,id);
        //新增sku
        if(CollUtil.isNotEmpty(insertSkuList)){
            relateAndInsertList(skuStockDao, insertSkuList, id);
        }
        //删除sku
        if(CollUtil.isNotEmpty(removeSkuList)){
            List<Long> removeSkuIds = removeSkuList.stream().map(PmsSkuStock::getId).collect(Collectors.toList());
            PmsSkuStockExample removeExample = new PmsSkuStockExample();
            removeExample.createCriteria().andIdIn(removeSkuIds);
            skuStockMapper.deleteByExample(removeExample);
        }
        //修改sku
        if(CollUtil.isNotEmpty(updateSkuList)){
            for (PmsSkuStock pmsSkuStock : updateSkuList) {
                skuStockMapper.updateByPrimaryKeySelective(pmsSkuStock);
            }
        }

    }
}

总结

如果我们要在数据库中存储一些格式不固定的属性时,可以采用JSON的形式进行存储。对于关联属性的修改,可以通过一些逻辑操作来实现不改变原有ID的修改。

项目源码地址

https://github.com/macrozheng/mall

推荐阅读


欢迎关注,点个在看

B2C电子商务系统研发——商品SKU分析和设计(一)
颜超敏的电子商务博客
02-06 6004
一、SKU及相关概念定义 在设计商品SKU之前,首先让我们熟悉一下SKU和相关的一些概念。 # 什么是SKU:      SKU=Stock Keeping Unit(库存量单位)      同一型号的商品,或者说是同一个产品项目(商品条形码是针对企业的产品 项目来进行定义的),因为产品与产品之间有某些属性不同,用以区别开这些 不同商品的属性即商品变异属性,又称
java实现商品sku_商品SKU功能设计优化
weixin_30369183的博客
03-02 2628
SpringBoot实战电商项目mall(30k+star)地址:github.com/macrozheng/…摘要原来的商品SKU设计存在着两个问题,一个是SKU设计上面比较固化,无法扩展。另一个是当修改了商品信息之后,商品SKU的ID会发生变化,由于购物车和订单商品都关联了商品SKU的ID,这样就会导致匹配不上。最近对这两个问题做了点优化,下面来聊聊优化的思路。商品的SPU和SKU首先我...
淘宝网商品SKU系统设计经验分享
stay hungry ! stay foolish!
09-22 7068
淘宝网商品SKU系统设计经验分享 转载:https://blog.csdn.net/hj7jay/article/details/52250897 淘宝商品属性设计 转载:https://blog.csdn.net/u010087886/article/details/51298398  
SPU 和SKU 是如何设计的(参考京东商城)
最新发布
风雨无阻学习之路
07-18 1185
按照我们的正常思维,一个商品有很多参数,比如一个手机,有品牌、产品名称、机身长度、机身重量、CPU、内存等等一系列,我们分别设计成字段,一张也就几十个字段,但是想想,这样做会有什么不妥,首先,我们设计数据库是设计一个全品类的电商平台,商品有很多种,我们打开京东看看,手机的规格与包装。我们在设计数据库的时候,大多都是按照我们自己的实际需求来设计,提供这几篇仅为大家参考学习,能够举一反三参与到项目实战中,希望大家可以学到东西,同时,文章内容如果有错误的位置希望大家可以指正,共同学习。
电商项目商品规格参数设计SKU和SPU设计
06-18
【课程介绍】     课程目标:             - 掌握商品规格数据结构设计思路             - 实现商品规格查询             - 掌握SPU和SKU数据结构设计思路             - 实现商品查询             - 了解商品新增的页面实现             - 独立编写商品新增后台功能     适合人群:必须得有一定的Java基础,会SSM框架的同学         本课程主要涉及到商品规格参数的设计,包括商品规格设计,后期会包含展示的课程都会有
SKU
killerover84的专栏-----天下
08-14 2633
分类: (商品分类编号, 分类名称, 父分类编号) (1, 男装, 0) (2, 裤子, 1) (3, 外套, 1) (4, 内裤, 1) (5, 袜子, 1) 商品: (商品编号, 商品名称, 商品分类编号, 卖家编号, SPU销量, 评论数) (1, '裤子名', 2, 1, 0) (2, '外套名', 3, 1, 0) (3, '内裤名', 4, 1, 0) (4, '袜子名', 5,...
电子商务SKU设计思路
01-19
SKU=Stock Keeping Unit(库存量单位) 同一型号的商品,或者说是同一个产品项目(商品条形码是针对企业的产品项目来进行定义的),因为产品与产品之间有某些属性不同,用以区别开这些不同商品的属性即商品变异属性,又称作SKU属性,因为它决定了SKU
sku设计mysql_商品SKU功能设计优化
weixin_36296983的博客
12-31 608
原来的商品SKU设计存在着两个问题,一个是SKU设计上面比较固化,无法扩展。另一个是当修改了商品信息之后,商品SKU的ID会发生变化,由于购物车和订单商品都关联了商品SKU的ID,这样就会导致匹配不上。最近对这两个问题做了点优化,下面来聊聊优化的思路。商品的SPU和SKU首先我们来了解下商品SPU和SKU的概念,可能很多没有接触过电商的朋友都不了解。SPU(Standard Product ...
jquery实现商品sku多属性选择功能(商品详情页)
11-29
在本文中,我们将探讨如何使用jQuery来实现一个商品SKU(Stock Keeping Unit)多属性选择的功能,特别是在商品详情页上的应用。首先,我们需要理解SKU的概念。SKU是库存量单位,用于管理和定价库存,尤其在具有多种...
Android 商品属性SKU选择
03-14
在Android应用开发中,商品属性SKU(Stock Keeping Unit)选择是一项关键功能,它涉及到电商平台的商品管理、库存控制以及用户交互体验。本篇文章将深入探讨如何在Android中实现类似淘宝的商品属性选择界面,以及...
vue+jq实现商城商品属性的添加以及生成格并还原到前端展示sku
05-17
在本文中,我们将深入探讨如何使用Vue.js和jQuery来实现一个商城商品属性的添加功能,以及如何生成格并在前端展示SKU。这个功能对于电商网站来说至关重要,因为它允许用户选择不同商品属性组合,并实时查看...
商城sku之数据设计
08-22
主要是描述了一些关于sku方面的知识点,还加入数据设计结构,主要针对产品方面的多规格设计结构,从而实现了目前市场主流的商品sku设计
购物商城SPU-SKU数据库设计.sql
05-16
购物商城SPU、SKU的数据库设计,所属MYSQL数据库,可将设计思想用于其他数据库。可用于B2B、B2C网站类型电子商务的项目。
仿淘宝SKU(销售属性)格生成的实例代码
04-28
销售属性;仿淘宝SKU;SKU
商城sku设计.md
08-11
商品多规格设计
【精品】电商项目 中 基于SPU与SKU商品 数据库设计
03-30 1933
上述数据设计方案适用于商品类别差异不是很大的情形,通过的字段可以发现不同的商品之间变化的信息只有 attribute_list 字段, 而这个字段通过json来存储各种不同的属性集合, 同样sku中变化的字段只有 product_specs 也是通过json来存储各种不同属性组合。改进方案将tb_product、tb_brand、tb_product_specs中的info字段分别抽取到单独的中。附:相关的SQL文件/**/;id。
小规模的商品sku 开发
weixin_43966245的博客
05-07 535
做一个小的商品系统在这里分享一下: 一 首先看一下商品数据库的设计 用户可根据不同的属性选择 进行组合 出对应的产品 例如: 属性 : 颜色 形状 颜色: 红色 白色 形状: 正方形,三角形 如果后台工作人员全选的话 那么就应该生成四条数据 这里写一下生成工具: 我这里从前端页面传输的格式是 属性id|属性名称|属性值id|...
电商erp 商品管理 sku结构应该怎么设计
07-02
### 回答1: 电商ERP商品管理SKU结构的设计应考虑到商品属性、属性值、库存以及价格等因素。 首先,SKU需包含商品基本信息,如商品ID、商品名称、商品描述等。同时,每个SKU可以对应多种商品属性,因此还需添加属性和属性值。属性可以包括属性ID、属性名称等字段,属性值可以包括属性值ID、属性值名称以及对应的属性ID等字段,以方便SKU与属性的关联。 其次,SKU还需考虑库存管理。可以在SKU中添加库存字段,记录当前SKU的库存数量。此外,还可添加预警字段,当库存数量低于设定值时,可以通过预警系统提醒相关人员及时补充库存。 此外,价格管理也是SKU的重要一部分。可以在SKU中添加价格字段,记录当前SKU的价格。如果存在活动价和原价区分,可以添加活动价字段和原价字段,以便进行价格展示和计算。 在设计SKU结构时,还需考虑到商品SKU的关系。一个商品可以对应多个SKU,而一个SKU只能对应一个商品。因此可以在SKU中添加商品ID字段,将SKU商品进行关联。 总之,电商ERP商品管理SKU结构的设计应当综合考虑商品属性、属性值、库存以及价格等因素,以便实现商品属性管理、库存管理和价格管理等功能。 ### 回答2: 电商ERP商品管理中,SKU(Stock Keeping Unit)结构的设计应考虑以下几个方面: 1. 商品基本信息:包括商品ID、商品名称、商品描述等字段,用于唯一标识商品和展示商品基本信息。 2. SKU属性信息:不同SKU可能存在不同的属性,如颜色、尺寸、款式等,可以通过添加属性字段来描述SKU的不同属性。 3. SKU库存信息:包括SKU的库存数量、可售数量等字段,用于实时更新和管理SKU的库存情况。 4. SKU价格信息:包括单价、折扣、促销价等字段,用于管理SKU的定价和促销活动。 5. SKU销售属性:对于存在销售属性的SKU,如鞋子的尺码、颜色等,可以通过添加销售属性字段来记录每个SKU的销售属性组合,方便在下单时进行选择。 6. SKU关联商品信息:对于有关联关系的商品,如套装、推荐组合等,可以通过添加关联商品字段来建立SKU与其他商品的关联关系。 7. SKU图片信息:每个SKU可能有不同的展示图片,可以通过添加图片字段来关联SKU对应的图片信息,方便展示和管理。 8. SKU状态信息:记录SKU的状态,如上架、下架、缺货、预售等,方便管理SKU的上下架和库存状态。 综上所述,电商ERP商品管理中,SKU结构的设计应综合考虑商品基本信息、SKU属性、库存信息、价格信息、销售属性、关联商品、图片和状态等多个方面,以便有效管理和展示SKU的信息。 ### 回答3: 电商ERP商品管理SKU设计需要考虑到以下几个方面。 首先,SKU是指库存单位,它应该包括商品的唯一识别码以及与该商品相关的属性信息,以便于与商品进行关联。因此,SKU应该包含一列用来存储商品的唯一识别码,比如商品编号或条形码。此外,还可以添加其他列来存储商品的属性信息,例如颜色、尺码、款式等。 其次,SKU的结构应该考虑到商品的多样性和组合性。同一款商品可能有多个SKU,每个SKU对应于不同的属性组合。因此,可以使用多列来存储不同的属性信息,然后使用这些列的组合作为SKU的唯一识别码。例如,如果商品具有颜色和尺码两个属性,则可以添加两列分别存储颜色和尺码的信息。 此外,SKU还应该包含与库存相关的字段。例如,可以添加一列来存储该SKU对应的库存数量,以便实时跟踪商品的库存情况。还可以添加一列来存储该SKU对应的价格信息,以便查询和更新商品的价格。 最后,SKU设计还应该考虑到性能和扩展性的需求。如果SKU的数据量较大,可以考虑使用索引来优化查询性能。另外,可以添加其他辅助或字段来存储与SKU相关的数据,如销售记录、供应商信息等,以便于扩展和管理。 综上所述,电商ERP商品管理SKU设计应该综合考虑商品属性、库存信息、性能需求和扩展性,以便于准确、高效地管理和查询商品信息。
249
原创
903
点赞
5505
收藏
1588
粉丝
关注
私信
写文章

热门文章

  • 微服务权限终极解决方案,Spring Cloud Gateway + Oauth2 实现统一认证和鉴权! 41407
  • 手把手教你搞定权限管理,结合Vue实现菜单的动态权限控制! 27640
  • 神器 SpringDoc 横空出世,最适合 SpringBoot 的API文档工具来了~ 22709
  • 如何在5天内学会Vue?聊聊我的学习方法! 19355
  • RabbitMQ实现延迟消息居然如此简单,整个插件就完事了! 14747

分类专栏

  • mall学习教程 151篇
  • SpringCloud学习教程 26篇
  • K8S学习教程 9篇
  • 开源之路 9篇

最新评论

  • 全面升级!一套基于最新版Spring Cloud的微服务实战项目!

    飞羽疾驰: 很棒!我之前在自学精灵网站学的,一周学会了SpringBoot实战

  • 再见RocketMQ!全新一代消息中间件,带可视化管理,文档贼全!

    阿呆159: @Autowired private PulsarTemplate<MessageDto> template;为什么我的这个装配不进去,显示找不到

  • Mall电商实战项目专属学习路线,主流技术一网打尽!

    秋是第二春: 不耐高并发啊哥,技术栈全,但是不深

  • 一个不容错过的Spring Cloud实战项目!

    飞羽疾驰: 可以的,我看的另一个SpringCloud项目视频,从零开发,五天学会了SpringCloud项目实战:https://knife.blog.csdn.net/article/details/134659054

  • Github标星 8K+,免费又好用的Redis客户端工具!

    鹏飞追梦: AnotherRedisDesktopManager 不支持命令参数启用,其他还是挺不错的,2024年还不支持,有待提高。

最新文章

  • 全面升级!一套基于最新版Spring Cloud的微服务实战项目!
  • 全面升级!一套基于Spring Boot 3+JDK17的实战项目!
  • 还在从零开始搭建项目?这款基于SpringBoot 3的快速开发脚手架值得一试!
2024年2篇
2023年8篇
2022年49篇
2021年45篇
2020年95篇
2019年81篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值

天下网标王装修行业网站优化引流淄博优化网站效果四川网站优化公司网站优化标题优化南山网站优化效果网站图片优化的四个小妙招新媒体如何优化网站五莲网站优化选哪家华容区网站做优化怎么样合肥网站优化工资怎么样优化网站排名禄珊云速捷妙手潮州网站搜索优化潮州企业网站关键词优化方法有经验的网站品牌优化咨询热线网站快速优化哪家规模大华阴百度网站优化拉萨网站优化报价网站基础优化健康监测仙桃关键词网站优化电商网站优化系统即墨网站如何做优化嘉兴网站优化排沁阳外贸网站优化费用多少江阴网站优化好不好新乡网络网站搭建优化香河网站seo优化保定网站搜索排名优化哪家好优化网站设计质醇扌云速捷沈阳网站优化培训班山西网站优化平台香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

天下网标王 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化