一个电商项目的Web服务化改造3:改进方案の规范和约定、单表、单一职责
上一篇,我们描述了原有项目中的问题。
或者说是,本篇的基本背景。
本篇开始,给出我们的改进方案和技术架构。
不过,根据自己的理解,我先列出了“规范和约定”。
因为,我认为“规范和约定”是具体方案和解决办法的基石,也是很多互联网项目的基本准则吧。
2.改进方案和技术架构
约定优于配置
约定优于配置(convention over configuration),也称作按约定编程,是一种软件设计范式,
约定优于注释
这个是我自己的见解。
用标准,统一的英文单词,给变量和函数等命名。
比如数据库表brand表有个字段name。
BrandDao有个add和update方法。
brand:就是品牌的意思
name:就是品牌的名称
add:就是增加一个品牌,BrandDao中,千万别用addBrand这种啰嗦的命名方式,类名中已经包含了Brand,里面的dao就是和brand相关的。
update:就是更新一个品牌
不用去写注释,也不用去和相关人士,过多解释这个字段的意思,这个函数的作用。
望文生义,通过名字就可以知道准确的意思,就不用多费口舌了。
对于那些复杂的代码,比如订单支付过程中,有一些不好理解的业务逻辑代码,再写简洁的注释。
web服务比较多,到处都是, 一个服务和对应的数据库是逻辑上在一起的。
感觉有点说不通呢?多表凭啥不能做到“服务分离” 。
更准确的理由,应该是下面提到的“分库分表”,然后才是“服务分离”这个 。
单表的结果集,方便缓存,而多表则不合适。
比如user表有roleId字段,查询用户的时候,查1个用户,再根据roleId查角色信息。
但是,关联的角色名称可能变化了,或者user用户信息变了,而角色不变。
那么,可以单独缓存user或者role。
而多表的情况下,还是都查询了数据库。
当数据量大的时候,笛卡尔积很大,10000*10000,占用的内存很大。
假设内存足够的话,笛卡尔积的过程,也很需要时间。
而单表查询,没有笛卡尔积的过程,先批量查A,比如10条,再批量去B查,1次10条,代码组装,数据就够了。
这里面存在一个问题,当A-B表关联查询,但是查询条件是B表字段的时候,这个是否必须“关联查询”。
比如,根据用户角色名称,查询用户,获得第1页10条数据。
如果还是单表的情况,就需要做“冗余”。
因此,我们说“单表”存在2个含义。
一、只有自己一个表的数据,二、物理上是一个表,但逻辑上有2个表的数据。
每个表数据量、查询查询、修改次数等都不一样。
单个表,如果需要锁住一行,也更加精准。
这个地方,还不是特别确定。
单表锁一行:select * from brand where id =1 for update
多表锁一行:select * from user left join role on user.roleId = role.id where roleId = 1 for updte ?
准确的说,以上是“并发修改” 中的1个例子,还有“并发查询”等很多种并发场景吧。
数据量大的时候,需要分表分库。
分表分库之后,联合查询就很废材了。
这一点,和把整个项目拆分成商品product、用户user等思想是类似的。
拆分成更小粒度的,方便做优化。
疑问: 既然MySQL多表这么废材,为什么当初设计MySQL等数据库的时候,都有关联查询等一大堆功能特性呢?
难道是因为互联网崛起,超出了当初设计者的想象力?
一个接口集,对外提供的服务,也是紧密相关的。
个人观察:多问几个为什么,可以发现更多的问题,学到更多更深入的“知识点” 。
用单表是好,为啥不能用“多表联合查询” ,通过对这个问题的思考和交流,理解更近了一步。
约定优于注释,算是我的独家见解吧~
一个电商项目的Web服务化改造3:改进方案の规范和约定、单表、单一职责的更多相关文章
- 一个电商项目的Web服务化改造4:方案和架构,通用接口的定义和实现
最近一直在做一个电商项目,需要把原有单系统架构的项目,改造成基于服务的架构,SOA. 有点挑战,做完了,会有很大进步. 上一篇,我们明确了我们的"规范和约定". 从 ...
- 一个电商项目的Web服务化改造
一个电商项目的Web服务化改造 项目,早期是随便瞎做的,没啥架构,连基本的设计也没. 有需求,实现需求,再反复修改. 大致就是这么做的. 最近,项目要重新架构,和某boss协商的结果是,采用阿里开源的 ...
- 一个电商项目的Web服务化改造6:单元测试4步走,构造数据、执行操作、断言、回滚
最近一直在做一个电商项目,需要把原有单系统架构的项目,改造成基于服务的架构,SOA. 有点挑战,做完了,会有很大进步. 单元测试,在很早之前的文章已经介绍过. 可以在这里看到相关的 ...
- 一个电商项目的Web服务化改造5:面向服务的分层架构设计(有图有真相)
最近一直在做一个电商项目,需要把原有单系统架构的项目,改造成基于服务的架构,SOA. 有点挑战,做完了,会有很大进步. 本篇,以我亲自画的3个图,阐述一下架构设计. 一.分层架构-总体图 ...
- 一个电商项目的Web服务化改造2:现有项目的5个问题
最近一直在做一个电商项目,需要把原有单系统架构的项目,改造成基于服务的架构,SOA. 有点挑战,做完了,会有很大进步, 1.现有项目的问题 1.1代码风格不统一 不同的 ...
- 一个电商项目的Web服务化改造7:Dubbo服务的调用,4个项目
使用dubbo服务的过程,很简单,和之前学习的WebService完全一样,和本地接口调用也基本一致. dubbo和WebService的区别:我认为dubbo就是封装了WebService,然后提供 ...
- 如何一步一步用DDD设计一个电商网站(六)—— 给购物车加点料,集成售价上下文
阅读目录 前言 如何在一个项目中实现多个上下文的业务 售价上下文与购买上下文的集成 结语 一.前言 前几篇已经实现了一个最简单的购买过程,这次开始往这个过程中增加一些东西.比如促销.会员价等,在我们的 ...
- 如何一步一步用DDD设计一个电商网站(十)—— 一个完整的购物车
阅读目录 前言 回顾 梳理 实现 结语 一.前言 之前的文章中已经涉及到了购买商品加入购物车,购物车内购物项的金额计算等功能.本篇准备把剩下的购物车的基本概念一次处理完. 二.回顾 在动手之前我对之 ...
- 如何一步一步用DDD设计一个电商网站(七)—— 实现售价上下文
阅读目录 前言 明确业务细节 建模 实现 结语 一.前言 上一篇我们已经确立的购买上下文和销售上下文的交互方式,传送门在此:http://www.cnblogs.com/Zachary-Fan/p/D ...
随机推荐
- 产品架构model
- YTU 2715: 函数---判断某年某月某日是这一年中的第几天
2715: 函数---判断某年某月某日是这一年中的第几天 时间限制: 1 Sec 内存限制: 128 MB 提交: 380 解决: 155 题目描述 在主程序(main)中输入某年某月某日,例如2 ...
- 直接使用FileSystem以标准输出格式显示hadoop文件系统中的文件
package com.yoyosys.cebbank.bdap.service.mr; import java.io.IOException; import java.io.InputStream; ...
- 【洛谷2839/BZOJ2653】middle(主席树)
题目: 洛谷2839 分析: 记\(s_i\)表示原序列中第\(i\)大的数. 考虑对于任意一个区间\([a,b]\),设它的中位数为\(s_m\),那么这个区间内大于等于\(s_m\)的数和小于\( ...
- ACM_蛋糕小王子铁头娃
Problem Description: 铁头娃制作了很多蛋糕,想分给他的小伙伴们,他的小伙伴很喜欢铁头娃做的蛋糕,每个人都想分到最多蛋糕 铁头娃想到了一个头铁主意:先给小伙伴们从1到N编号,在1-N ...
- Android内存管理(9)*MAT:Heap Dump,Shallow Heap,Retained Heap,Dominating Tree,GC Roots等的含义
原文: http://help.eclipse.org/mars/index.jsp?topic=%2Forg.eclipse.mat.ui.help%2Fconcepts%2Fheapdump.ht ...
- C# 文件操作【转】
本文也收集了目前最为常用的C#经典操作文件的方法,具体内容如下:C#追加.拷贝.删除.移动文件.创建目录.递归删除文件夹及文件.指定文件夹下面的所有内容copy到目标文件夹下面.指定文件夹下面的所有内 ...
- Android 将图片网址url转化为bitmap
public Bitmap returnBitMap(final String url){ new Thread(new Runnable() { @Override public void run( ...
- C# winform启动外部exe后,如何完全阻断父界面接收事件,扩展waitforexit
公司的系统搭载了好多奇奇怪怪的exe,以前启动exe后,系统还能接着操作.但是后面又提出额外的需求,说是打开外部exe之后,启动exe的父界面要完全不能进行任何操作.当然按常人所想再加一句waitfo ...
- html5——伸缩比例
基本概念 1.父盒子设置了伸缩属性,子盒子设置伸缩比例 2.以上设置完之后子盒子会按照比例分布在父盒子中 3.当设置伸缩比例时默认会按照x轴方向分配,因为默认情况下伸缩布局主轴方向是x轴方向 4.设置 ...