程序员过关斩将--你的业务是可变的吗
请不要跟我说用ES或者其他,其实很多中小公司的业务就是如此,就是基于mysql或者sqlserver 来搞这样的业务
业务场景
不知道通过D妹子的阐述,大家了解情况了没。这里菜菜再详细说一下。D妹子的程序记录了订单的log来供其他业务(比如统计)使用,这里就以统计业务来说,OrderLog表设计如下:
列名 | 数据类型 | 描述 |
---|---|---|
OrderId | nvarchar(100) | 订单号,主键 |
UserId | int | 下单用户id |
Amount | int | 订单的金额 |
其他字段省略... |
除此之外还有一个用户信息表UserInfo,设计如下:
列名 | 数据类型 | 描述 |
---|---|---|
UserId | int | 用户id,主键 |
ProvinceId | int | 用户省的id |
CityId | int | 用户市的id |
CountyId | int | 用户区县的id |
涉及到拆单等复杂的订单操作,表的设计可能并非如此,但是不影响菜菜要说的事
变数的业务
现在假如要统计某个省的订单总数,sql如下:
select count(0) from OrderLog o inner join UserInfo u on o.UserId=u.UserId where ProvinceId=@ProvinceId
复制代码
有问题吗,sql没问题,这时候用户A的省市区县信息突然变了(也许是在其他地区买房,户口迁移了),也就是说UserInfo表里的信息变了,那用以上的sql统计用户A以前省市区县的订单信息是不是就会出错了呢?(产品狗说在哪下的订单就属于哪的订单)
业务的定位
以上的问题你觉得是不是很简单呢?只要稍微修改一下表也许就够了。但是,菜菜要说的不是针对这一个业务场景,而是所有的业务场景的设计。那你有没有想过为什么D妹子的设计会出现这样的问题呢?
深刻理解业务才能避免以上类似的错误发生,一定要深刻理解不变和可变的业务点。 拿D妹子的统计来说,你的业务是统计区域的订单数,这个业务在产品设计上定义的是不变性,也就是说在行为产生的那个时间点就确定了业务性质,这个业务的性质不会随着其他变而变。具体到当前业务就是:用户在X省下的订单不会随着用户区域信息的变化而变化,说白了就是说用户在X省生成的订单永远属于X省。
谈到业务性质的不变性,对应的就有业务的可变性。假如你开发过类似于QQ空间这样的业务,那肯定也做过类似访客的功能。当要显示访客记录的时候,访客的名称在多数情况的设计中属于可变性的业务。什么意思呢?也就是说一个用户修改了姓名,那所有显示这个用户访问记录的的地方姓名都会同时改变。
说到这里,各位再回头看一下D妹子的业务,这里又牵扯到一个系统设计的问题,众所周知,一个好的系统设计需要把业务的变化点抽象提取出来,D妹子订单统计的业务变化点在于用户的省市区县会变化,订单的金额、订单号等信息不会变化。所以你们觉得是不是D妹子的数据表可以修改一下呢?
数据表的改进
改进用户信息
按照以上的阐述,D妹子业务的变化点在于用户的省市区域信息,所以可以把用户信息的表抽象提取出来,主键不再是用户id
列名 | 数据类型 | 描述 |
---|---|---|
Id | int | 主键Id,主键 |
UserId | int | 用户id |
ProvinceId | int | 用户省的id |
CityId | int | 用户市的id |
CountyId | int | 用户区县的id |
这样的话用户订单log表中就变为
列名 | 数据类型 | 描述 |
---|---|---|
OrderId | nvarchar(100) | 订单号,主键 |
UserBId | int | 对应用户表中的主键id |
Amount | int | 订单的金额 |
其他字段省略... |
这样设计的话,如果用户的省市区县信息有变动,相应的用户信息表中会存在多条用户省市区县数据
这里的用户信息表并非是用户对象的主表,而是根据订单业务衍生出来的表
改进业务数据表
根据业务的变性和不变性,既然把订单区域统计的业务定义为不变的业务性质,那订单的log表完全可以这样设计
列名 | 数据类型 | 描述 |
---|---|---|
OrderId | nvarchar(100) | 订单号,主键 |
UserId | int | 下单用户id |
ProvinceId | int | 用户省的id |
CityId | int | 用户市的id |
CountyId | int | 用户区县的id |
Amount | int | 订单的金额 |
其他字段省略... |
写在最后
各位读到这里,可能会感觉菜菜这次写的其实很鸡肋,但是,D妹子的场景却是真实环境中遇到的问题。问题的本质还是变性业务和非变性业务的定义和划分,和架构设计一样,数据库的设计其实也需要把变动的业务存储点进行抽象,其实应该说是抽离出来。
希望大家有所收获 --菜菜
添加关注,查看更精美版本,收获更多精彩
转载于:https://juejin.im/post/5d039aece51d45108c59a530
程序员过关斩将--你的业务是可变的吗相关推荐
- 程序员过关斩将--少年派登录安全的奇幻遐想
" 据说,这篇也是快餐,完全符合年轻人口味 说到登录,无人不知无人不晓.每一个有用户体系的相关系统都会有登录的入口,登录是为了确认操作人的正确性.说到登录安全,其实是一个很伟大的命题,不过常 ...
- 程序员过关斩将--请不要误会redis 6.0 的多线程
" 你对redis的单线程是不是有点误会? " 你对redis 6.0的多线程是不是也有点误会? " redis多线程一定可以提高性能吗? redis官方刚刚发布的6.0 ...
- 程序员过关斩将--从未停止过的系统架构设计步伐
" 首先,这篇文章肯定会得罪一些人 " 其次,此文只代表我个人的意见,仅供参考 从分层说起 谈到系统架构的分层和系统领域边界的划分,每个架构师,每个技术经理,甚至每个程序员都有自己 ...
- 程序员过关斩将--应对高并发系统有没有通用的解决方案呢?
" 灵魂拷问: 应对高并发系统有没有一些通用的解决方案呢? 这些方案解决了什么问题呢? 这些方案有那些优势和劣势呢? 对性能孜孜不倦的追求是互联网技术不断发展的根本驱动力,从最初的大型机到现 ...
- 程序员过关斩将--解决分布式session问题
微信搜一搜 架构师修行之路 session 说到 session,我相信每个程序员都不陌生,或多或少在项目中使用过.session 这个词,其实是一个抽象的概念,它不像 Cookie 那样有着明确的定 ...
- 程序员过关斩将--Http请求中如何保持状态?
微信搜一搜 架构师修行之路 这是一个被无数程序员撸过的问题,却只有少数人了解了真相.大体上搜了一下,网上关于http协议保持状态误导大家的文章还是有的,比如:有人说利用ViewState,那是asp. ...
- 程序员过关斩将--作为一个架构师,我是不是应该有很多职责?
点击上方"蓝字"关注我们领取架构书籍 每一个程序员都有一个架构梦. 上面其实本质上是一句富有事实哲理的废话,要不然也不会有这么多人关注你的公众号.这些年随着"企业数字化& ...
- 程序员过关斩将--为微服务撸一个简约而不简单的配置中心
点击上方蓝字 关注我们 毫不犹豫的说,现代高速发展的互联网造就了一批又一批的网络红人,这一批批网红又极大的催生了特定平台的一大波流量,但是留给了程序员却是一地鸡毛,无论是运维还是开发,每天都会担心服 ...
- 程序员过关斩将-- 喷一喷坑爹的面向UI编程
点击上方"蓝字"关注我们 菜菜哥,求你个事呗? 说来听听,假装你男朋友可不干 不是哦,是正经事.前几天一个项目UI改了,好多人跟着加班修改,怎么样尽量避免这种情况呢? UI修改顶多 ...
最新文章
- Repeater 嵌套 Repeater
- linux给用户写任务计划,linux——计划任务
- php js实现异步图片上传,使用php+js异步上传图片
- xampp php源码的路径,php – XAMPP中的根路径
- Android AsyncTask 深度理解、简单封装、任务队列分析、自定义线程池
- vue中使用v-on绑定事件中,获取$event.currentTarget,日志打印为null
- SAP CRM Fiori 应用的 offline 离线支持开发笔记
- SQLPLUS命令使用大全
- linux 网卡 巨帧,Linux Kernel e1000e驱动巨型帧处理绕过安全检查漏洞
- linux可平通网关但不能上网,redhat问题:能ping通网关和本网段的IP,但是不能ping通DNS,也不能上网...
- 简明易懂的call apply
- jquery 圆点绕圆旋转_jquery 圆形旋转图片滚动切换效果
- mysql用utf-8_切记:永远不要在MySQL中使用UTF-8
- paip.myeclipse7 java webservice 最佳实践o228
- 系统分析师论文评分标准
- 修路【NOIP2016提高组模拟】
- 新西兰八大名校--新西兰公立大学
- unity webgl 手机端微信直接打开链接
- 浅谈Attention机制
- HTML特效,旋转的正方体
热门文章
- java生成world文件_Hello World 项目创建与项目配置文件介绍
- 更新卡住解决_iPhone手机无法正常下载/安装应用的解决方法
- redisTemplate的hscan方法中为何不需要指定游标开始地址的原因
- 加密SD卡的新型身份认证方案
- SBUS协议转换芯片,SBUS转UART,sbus转rs232,sbus解码IC,zr003
- 宝宝退烧的天然方子(老中医的推荐)
- .Net学习(三):初识ASP.Net
- 何恺明“终结”ImageNet预训练时代:从0开始训练神经网络,效果比肩COCO冠军
- 不要钱还免安装!Photoshop杀手火了,网友:作者是上帝么?
- 协和医院等发起成立中国医学装备人工智能联盟