草庐IT

新零售SaaS架构:商品系统架构设计

汤师爷说 2023-03-28 原文

SaaS产品就像一座冰山,冰山以上的部分是功能、数据(可见部分)、用户界面,冰山以下是系统架构、完整的数据模型、开放体系、非功能性需求(扩展性、可维护性、性能、安全等)。

短期内想要快速上线产品,可能只需关注冰山以上的部分就够了,但是SaaS公司想要在市场上建立长期的竞争优势,比拼的一定是冰山以下的部分,并且在这块的投入绝对远超冰山以上的部分。

商品系统的定位

商品系统是零售SaaS最基础、最核心的系统之一。商品系统几乎需要支撑所有业务系统,例如C端商详、购物车、订单、履约、结算、售后、库存、供应链等,都需要依赖商品系统的能力。

为了保障业务的稳定性、可扩展性,必须要重视商品系统建设,否则,后续业务和系统将很快丧失扩展性和灵活性,甚至无法支撑业务发展,必须推倒重来,付出惨痛的代价才能挽回。

商品系统的挑战

行业需求差异大

不同行业对商品管理的需求差异非常大,想要构建成熟稳定的商品系统,需要对各行业的商品管理需求,进行深度分析。只有这样,才能抽象出共性的规律和特征,保障业务建模的质量。列举一些行业差异性需求:

  • 时尚服装:款式管理,配比、配码管理,商品季节性管理。

  • 3C数码:串码管理,配件管理,售后维修。

  • 美容护肤、医药保健:批号管理,生产日期与有效期管理,试用品管理。

  • 生鲜行业:生产日期与有效期管理 ,生鲜加工管理,称重商品与 PLU 码,辅助单位管理(管理重量和数量,例如:鱼,按照重量核算,以条作为辅助单位)。

支撑的业务链路广

商品系统作为最基础、最核心的系统之一,几乎所有业务系统,都需要依赖商品系统的能力。

从业务全流程来看,需要支撑采购、配送、销售、履约、退货、退仓、核算、结算、数据分析等各个业务环节。

从商品生命周期的管理来看,商品状态包括建档、新品、正常、淘汰、清理等,各个状态之间流转也异常复杂。

商品关键概念

商品基础

  • 平台SPU:指的是标准化产品单元,是商品信息聚合的最小单位,是一组可复用、易检索的标准化信息的集合,该集合描述了一个产品的特性,又可称为平台商品。

    SPU的概念来源于电商平台业务,第一个关键点在于,SPU模型会提取商品的共性属性用于信息检索,这些属性通常是能够快速识别商品,并且是消费者较为关心的属性;第二个关键点在于,SPU的属性是全平台标准化的,这样才能有效保障消费者的检索体验与商家利益,例如,消费者搜索256G的iphone12,有填容量的商品能搜出来,没填容量的商品就搜不出,这显然不合理,因此平台需要规范所有商品的关键属性。

  • 商品:特指商家的销售商品,一个商家可以有很多商品,若N个商家卖同一个商品,如iphone13,该场景下有1个平台SPU实例,N个商品实例。每个商品可以有多个规格,例如大小、颜色、尺码等。

  • SKU:SKU(为Stock Keeping Unit),指的是库存量单位,又称最小存货单位。以iphone13为例,关键规格有颜色(黑色、红色、银色、金色)、容量(128G、256G、512G),可以组合出4x3=12个SKU。

商品类型

  • 实物商品:以有形实体存在,不能通过网络来传递,必须依赖传统的物流运输系统来传递。例如,鸡蛋、大米、手机等。

  • 服务商品:能够实现交易的无形商品,无需物流参与,就能完成交易,例如,话费充值等。

  • 组合商品:一般指人为将几个单独售卖的商品组合在一起,进行合并售卖的商品,例如:下午茶套餐、七夕美妆组合等。

  • 多规格商品:代表一组SKU的商品,消费者只能选中其中某一个SKU,例如,以iphone13为例,关键规格有颜色(黑色、红色、银色、金色)、容量(128G、256G、512G),消费者选中了黑色128G的iphone13进行下单交易。

  • 预售商品:一般来说,预售商品会提前销售,但实物还未生产,因此,预售商品不会录入实物库存,售出也不会扣减实物库存。预售商品由一组原材料加工而来,加工关系一般称作配方,因此,当预售商品扣减库存时,实际会扣减原材料的库存。

商品类别

  • 前台类目:前台类目是面向消费场景和用户视角的分类,根据运营需求,灵活多变,主要用于用户快速筛选。

  • 后台类目:后台类目是前台类目搭建的基础,后台类目主要面向商家运营,相对稳定,不会经常变更。

  • 品牌:品牌是比较特殊的商品属性,需要单独进行管理。品牌是人们对一个企业及其产品、售后服务、文化价值的一种评价和认知,是一种信任。

商品属性

商品属性,又称为产品属性、商品参数,是产品本身固有的特征。不同行业的商品,差异性非常大,有很多行业差异化属性。根据使用目的、用途不同,商品演化出各式各样的属性,有的用于展示,有的用于分析,有的用于经营管控。

下面根据商品属性不同的分类法,逐一展开描述:

  • 描述属性:商品货号、商品名称、商品?描述、规格、型号、产地、等级、生产厂商、商品图片等。

  • 统计属性:品牌、分类、系列、款式、适用人群、适用年龄等。

  • 考核属性:一般用于组织业绩考核,品牌、分类、系列等。

  • 物流属性:长、宽、高、净重、毛重、重量单位等。

  • 管控属性:是否季节商品、是否保险、是否支持配送、是否支持打折、是否保质期管控、是否串码管理等。

  • 销售渠道属性:不同的销售渠道会有一些特殊的属性,例如,美团、饿了么的最小购买数量、平台分类等。

  • 销售属性:也称为规格属性,该属性是组成SKU的特殊属性,直接影响到买家的购买和商家的库存管理,例如衣服的颜色、尺寸。

商品价格

  • 指导价:厂商给出的一个出售的参考价格。

  • 销售价:商家根据自己情况提高或降低指导价得到的最终销售价格。

  • 渠道价格:在分渠道售卖的时候,商品的基础销售价格。

  • 时间价格:不同的时间,可以有不同的价格。

  • 成本价:一般特指商品的单个成本,成本价会到sku维度。

组织层级商品

  • 商品库:零售企业操作和管理商品的总集。

  • 管理层级商品:管理层级需要操作和管理的商品的集合,管理层级有多种形态,例如区域、部门、分公司、子公司等。

  • 店铺商品:即门店、商城等店铺单元的商品集合。

  • 渠道商品:发布到某个销售渠道的商品集合,例如微信商城、美团外卖、饿了么外卖等渠道。

商品状态

  • 商品的生命周期状态:建档、新品、正常、预淘汰、淘汰、清理、待归档等。

  • 商品的经营状态:商品在各个业务阶段,可以有不同的状态,来控制业务的经营,例如,商品销售状态上架、下架。

概念模型设计

商品应用架构设计

  • 展现层:直接与用户交互的层级,负责向用户显示信息,或解释用户命令。

  • 应用层:应用层的服务对应一个具有业务价值的场景用例,主要负责对核心服务进行组合和编排,负责处理场景用例内的执行顺序以及结果的组装,通过API网关向展现层提供服务。

  • 服务层:系统的核心层,负责表达业务概念、业务状态以及业务规则,包含了该领域(问题域)复杂的业务知识抽象和规则定义。该层难点在于领域对象分析上,例如实体,值对象,聚合(聚合根),领域服务,领域事件,仓储,工厂等方面的分析,成熟的领域逻辑不会有太大变化,所以服务层的业务逻辑通常是共性的、稳定的。

  • 主数据平台:主数据是跨部门、业务系统,能够反映核心业务实体状态的核心基础信息。 对于商品系统而言,商家信息、组织机构、员工权限、商品数据模型是该系统依赖的主数据。

    在业务早期,主数据平台是非必须的,上层系统模块直接从DB中读取数据并应用即可,但随着系统逐步复杂后,多个团队对数据的改动会互相影响,不利于系统扩展,可用性也大大降低,因此,需要拆分出多个主数据服务,将核心数据的访问收拢在一起。

小结

本文从商品系统的定位、挑战、概念模型、应用架构等方面,阐述了商品系统架构设计经验与方法,希望对读者有所帮助。在SaaS模式下,商品技术架构也存在大量挑战,例如可用性问题、数据一致性、大流量访问、分店商品大批量处理、商品数据模型治理等,会在后续的文章中一一介绍。

有关新零售SaaS架构:商品系统架构设计的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  3. 电脑0x0000001A蓝屏错误怎么U盘重装系统教学 - 2

      电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。  准备工作:  1、U盘一个(尽量使用8G以上的U盘)。  2、一台正常联网可使用的电脑。  3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。  4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。  U盘启动盘制作步骤:  注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注

  4. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  5. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  6. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  7. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  8. ruby-on-rails - 设计注册确认 - 2

    我在我的项目中有一个用户和一个管理员角色。我使用Devise创建了身份验证。在我的管理员角色中,我没有任何确认。在我的用户模型中,我有以下内容:devise:database_authenticatable,:confirmable,:recoverable,:rememberable,:trackable,:validatable,:timeoutable,:registerable#Setupaccessible(orprotected)attributesforyourmodelattr_accessible:email,:username,:prename,:surname,:

  9. ruby - 在没有基准或时间的情况下用 Ruby 测量用户时间或系统时间 - 2

    因为我现在正在做一些时间测量,我想知道是否可以在不使用Benchmark类或命令行实用程序time的情况下测量用户时间或系统时间。使用Time类只显示挂钟时间,而不显示系统和用户时间,但是我正在寻找具有相同灵active的解决方案,例如time=TimeUtility.now#somecodeuser,system,real=TimeUtility.now-time原因是我有点不喜欢Benchmark,因为它不能只返回数字(编辑:我错了-它可以。请参阅下面的答案。)。当然,我可以解析输出,但感觉不对。*NIX系统的time实用程序也应该可以解决我的问题,但我想知道是否已经在Ruby中实

  10. ruby - 以毫秒为单位获取当前系统时间 - 2

    在Ruby中,以毫秒为单位获取自纪元(1970)以来的当前系统时间的正确方法是什么?我试过了Time.now.to_i,好像不是我想要的结果。我需要结果显示毫秒并且使用long类型,而不是float或double。 最佳答案 (Time.now.to_f*1000).to_iTime.now.to_f显示包含十进制数字的时间。要获得毫秒数,只需将时间乘以1000。 关于ruby-以毫秒为单位获取当前系统时间,我们在StackOverflow上找到一个类似的问题:

随机推荐