Java生鲜电商平台-商城系统库存问题分析以及产品设计对逻辑/物理删除思考
Java生鲜电商平台-商城系统库存问题分析以及产品设计对逻辑/物理删除思考
说明:在生鲜电商的库存设计,是后台的重点,也是难点,关乎商品是否存在超卖。商品的库存增加方式倒不难,直接在后台添加即可,而扣减方式就尤为重要,用户在前端提交订单减库存,还是在支付成功后减库存,两种方案各有利弊,对后台库存数据的变化影响也很大。
这里且先不说两种方案的利弊,先看看淘宝是如何做的,淘宝是将两种方案都做了,给卖家选择。
12306是怎么做的呢,小编大胆的猜想,是支付成功后,减的库存,而且一定是。
下面来分析下两种方案的利弊:
第一种,提交订单的时候减库存:加入A商品库存数为100,采用下单后,减库存的方案,常规商品系统,下单归下单,支付归支付,是区分开的,例如在10分钟内,有99个人下单了并且支付,身下一个订单,同一个时间,有两个人同时下单,比如都是2019.10.10 12:32:12 这个时间点,由于系统在这个时间点判断都还有一个库存,所以他们两个都完成了下单操作,此时库存为商品库存为0,但是实际上是101个人下了单,而且这101个人都可以支付成功,这时候就出现了超卖现象。
出现这种情况的场景有两个:一个是商品火爆,短时间内被下单,还有一个是商品库存量小。
优点:实时减库存,避免付款时应库存不足,减库存问题
弊端:存在说在短时间内,很多人都下单了,但是没有支付,一直锁定着库存数据。真正的买家买不到
第二种,在支付成功的时候减库存:案例同第一种方案中的案例,也是存在同样的问题,在同一个时间点:比如都是2019.10.10 12:32:12 这个时间点,100件库存,有101人同时支付,产品依然存在超卖现象
优点:防止有人恶意下单,占用库存
弊端:在并发量很高的情况下,依然会存在超卖现象。买家认为已经下单了,但是告知不能付款
解决方案
关于超卖问题,根本上是不可解决的,但是可以通过一些优化方案,将风险降低
方案一:限制用户下单数量
方案二:对恶意下单的做标识
方案三:后台库存预警
方案四:备用库存
关于秒杀活动对库存问题的分析
数据库最基本的增删改查,一套最基本的完整的流程:数据的创建-->数据的修改-->数据删除,其中数据的删除,又分为逻辑删除和物理删除。
那么什么是逻辑删除,物理删除呢,他们又有什么区别,在软件设计过程中为什么有些数据只能设计成逻辑删除,不能物理删除?
简单的说:作为用户,在软件上将数据删除,而实际上在数据库中没有删除,只是从用户层显示数据已经删除了。而物理删除,用户在软件上将数据删除了,数据库中的数据也被彻底的删除了。
逻辑删除/物理删除
举一个例子,关于订单的删除,你是一个淘宝买家用户,你在淘宝上购买了一件商品,付款成功,并且也收到货,确认收货了,整个订单的状态已经完成了,你把这个订单删除了,这时候的删除只是逻辑删除了。也就是数据库中,这个订单还是存在,但是你手机上不会显示这个订单了。为什么数据库中的订单还是存在,不一并删除了?这就设计到数据的关联问题:
这个订单是你下单,支付成功并完成删除动作,没有错,单单从你的角度考虑,它已经完成了。我们先不考虑系统层面为什么不能删除,1 从卖家角度考虑,卖家要统计他的销售情况,不能因为买家将订单删除了,这条订单就不统计了吧,2 从商品角度考虑,a,商品是有商品库存的,例如100件商品,你购买了一件,变成99件;b 商品的评分评星。等等。3 从物流的角度考虑,由于订单是订单,物流单是物流单,但是物流单和订单是有关联的,且不讨论是单项关联还是双向关联,把订单删除了,物流单关联订单为null,这时候是不是会报错呢。等等各方面因数,以及后期新功能的开发,牵连到订单,都会受到影响。
那有人会说,那我设计系统,所有的数据均设计为逻辑删除,不是可以了,从逻辑上讲,是的,但是有些又可以物理删除,比如你创建一个数据,这条数据没有和他的业务有关联,仅仅是一条数据,这时候删除,就可以物理删除了,有人会问,系统设计,数据都是有关联的,如果没有关联,就不是系统了,是的,我是说这条数据还没和他其他业务有关联,不代表没有关联,一旦数据关联了,有时候逻辑删除都不行的,例如一级目录,二级目录,而且目录已经和其他业务产生了关联关系,这时候要删除一级目录,由于二级目录是寄托在一级目录下的,所以一级目录连逻辑删除都不可以,删除了,二级目录就没有了寄托了哈
谈一谈本地删除和云端删除
举一个的例子:现在很多人会把通讯录备份到云端,在换手机的时候,已经从云端同步下来即可,在删除通讯录联系人的时候,手机经常回提示,是否要同步删除云端数据,如果同步删除,则是云端删除。此时有人会问,本地删除,云端也删除了,是不是就是逻辑删除呢。不一定,看系统是如何设计,如果还是设计成物理删除,那么数据库中你的数据其实还是存在的,所以云端删除和物理删除没有直接的关系。
再谈一谈后台产品关于禁用的概念
禁用又是什么,禁用后又可以启用,这里在对账号体系经常用到,由于账号关联的东西很多,所以账号在原则上设计是不能物理删除的(这里强调是原则上,由于又有账号注销一说,所以账号不是不能物理删除的)账号用来禁用启用,限用时段,例如你在用一个系统,由于现实因数,你不能在用这个系统了,系统管理员要把你账号封了,这时候就是禁用操作,禁用后不可登。为什么不能物理删除,前文已经说过了,那么为什么这时候账号是禁用,而不是逻辑删除了,因为存在一种场景,你后面又回来了,又要用这个账号,从业务角度,你用之前的账号才是对的,而不是重新在键一个新的账号。禁用后一键启用就可以了。另外就是to c 产品禁用到的禁用时段,比如大家经常玩的王者荣耀,账号被限制1小时不能玩,这时候就是对你账号禁用一小时,一小时后重新恢复正常。
说了这么多,产品在设计的时候,什么情况下考虑物理删除,什么情况下考虑逻辑删除,以及本地删除和云端删除,需要从整个系统层面考虑,删除后会影响什么业务,另外在不确定的情况线下,不要轻易物理删除,因为后期也可能会关联到,这些后端开发会考虑到的,但是作为一个产品,要懂得删除这些道理,不要被后端认为一个小白,只会提“无脑需求”,这样一来,沟通也好了,业务的开展也方便了。
关于账号注销
最后的最后,聊一下关于账号的注销,好像国家有规定,用户可以创建账号,也可以自行注销账号,像qq,支付宝等均有账号注销功能,那么账号注销,从用户角度,彻底清空了账号了,他还物理删除呢,还是逻辑删除呢?注意这是国家规定的一个方面,目前市面上大部分的产品是没有注销功能的,不用不管不登录就好了。这...关于账号的注销又何去何从....
Java生鲜电商平台-商城系统库存问题分析以及产品设计对逻辑/物理删除思考的更多相关文章
- Java生鲜电商平台-优惠券系统的架构设计与源码解析
Java生鲜电商平台-优惠券系统的架构设计与源码解析 电商后台:实例解读促销系统 电商后台系统包括商品管理系统.采购系统.仓储系统.订单系统.促销系统.维权系统.财务系统.会员系统.权限系统等,各系统 ...
- Java生鲜电商平台-促销系统的架构设计与源码解析
Java生鲜电商平台-促销系统的架构设计与源码解析 说明:本文重点讲解现在流行的促销方案以及源码解析,让大家对促销,纳新有一个深入的了解与学习过程. 促销系统是电商系统另外一个比较大,也是比较复杂的系 ...
- Java生鲜电商平台-商城后台架构与原型图实战
Java生鲜电商平台-商城后台架构与原型图实战 说明:生鲜电商平台的运营平台,其中需要很多的功能进行管理.目前把架构与原型图实战分享给大家,希望对大家有用. 仪表盘/首页,简单统计,报表页,运营快捷口 ...
- Java生鲜电商平台-商城优惠券设计要点复盘与总结
Java生鲜电商平台-商城优惠券设计要点复盘与总结 Java生鲜电商平台本文将从优惠券设计用户端,需求端,业务流程全方案解析优惠券设计方案 为什么要设计优惠券 设计优惠券的核心:拉新和促活 新产品上线 ...
- Java生鲜电商平台-秒杀系统微服务架构设计与源码解析实战
Java生鲜电商平台-秒杀系统微服务架构设计与源码解析实战 Java生鲜电商平台- 什么是秒杀 通俗一点讲就是网络商家为促销等目的组织的网上限时抢购活动 比如说京东秒杀,就是一种定时定量秒杀,在规定 ...
- Java生鲜电商平台-App系统架构开发与设计
Java生鲜电商平台-App系统架构开发与设计 说明:阅读此文,你可以学习到以下的技术分享 1.Java生鲜电商平台-App架构设计经验谈:接口的设计2.Java生鲜电商平台-App架构设计经验谈:技 ...
- Java生鲜电商平台-RBAC系统权限的设计与架构
Java生鲜电商平台-RBAC系统权限的设计与架构 说明:根据上面的需求描述以及对需求的分析,我们得知通常的一个中小型系统对于权限系统所需实现的功能以及非功能性的需求,在下面我们将根据需求从技术角度上 ...
- Java开源生鲜电商平台-财务系统模块的设计与架构(源码可下载)
Java开源生鲜电商平台-财务系统模块的设计与架构(源码可下载) 前言:任何一个平台也好,系统也好,挣钱养活团队这个是无可厚非的,那么对于一个生鲜B2B平台盈利模式( 查看:http://www.cn ...
- Java生鲜电商平台-生鲜售后系统的退款架构设计与代码分享
Java生鲜电商平台-生鲜售后系统的退款架构设计与代码分享 说明:任何一个电商行业都涉及到退货与退款的问题,但是生鲜电商行业还设有一个显著的特点,那就是换货.在人性面前,各种各样的退货,退款,换货的售 ...
随机推荐
- Python 浮点数的冷知识
本周的PyCoder's Weekly 上分享了一篇小文章,它里面提到的冷知识很有意思,我稍作补充,分享给大家. 它提到的部分问题,读者们可以先思考下: 若两个元组相等,即 a==b 且 a is b ...
- 在 .NET Core 中使用 Diagnostics (Diagnostic Source) 记录跟踪信息
前言 最新一直在忙着项目上的事情,很久没有写博客了,在这里对关注我的粉丝们说声抱歉,后面我可能更多的分享我们在微服务落地的过程中的一些经验.那么今天给大家讲一下在 .NET Core 2 中引入的全新 ...
- [译]C# 7系列,Part 9: ref structs ref结构
原文:https://blogs.msdn.microsoft.com/mazhou/2018/03/02/c-7-series-part-9-ref-structs/ 背景 在之前的文章中,我解释了 ...
- Python 使用中出现错误:ImportError: No module named _sqlite3
解决办法: 1.先安装sqlite3 从sqlite官网:https://www.sqlite.org/download.html 上下载linux环境下的安装包:sqlite-autoconf ...
- 查询BPC动态表
今天BASIS说后台有张数据表(/1CPMB/ABLBCAD)数据量已超过20亿,需要归档,但是不清楚是哪个业务模型. 有两种方式可以查询BPC动态生成的表名. (1)根据命名规则 环境前缀:apps ...
- styled-components:解决react的css无法作为组件私有样式的问题
react中的css在一个文件中导入,是全局的,对其他组件标签都会有影响. 使用styled-components第三方模块来解决,并且styled-components还可以将标签和样式写到一起,作 ...
- 如何从Mac删除恶意广告软件,摆脱那些通过弹出广告或工具栏入侵Mac的恶意软件
厌倦了那些利用弹出式广告和工具栏之类入侵Mac的恶意软件?该如何摆脱Mac上的恶意软件呢?今天小编为大家带来两种方法从Mac 删除广告软件,甚至阻止它到达您的Mac,感兴趣的朋友一起来看看吧! 方法一 ...
- jQuery 源码解析(二十五) DOM操作模块 html和text方法的区别
html和text都可以获取和修改DOM节点里的内容,方法如下: html(value) ;获取匹配元素集合中的一个元素的innerHTML内容,或者设置每个元素的innerHTML内容, ...
- .net core 3.0web_razor page项目_使用中间件接受大文件上传报错_httpRequest.Form threw an exception of type Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException_Request body too large
前言:在web项目的.net framework时文件上传时,自己常用一般处理程序接受上传文件,上传文件的大小限制是可以项目的webconfig里配置. 到core项目使用一般处理程序变成了中间件 ...
- 3.java基础之关键字instanceof
1. instanceof 使用:对象引用名 instanceof 类名 作用:来判读引用的对象和类名是否兼容(是否继承该类,或爷爷辈的类) 例子: Team team = new Team(); t ...