Fork me on GitHub

阿里巴巴Java开发手册———个人追加的见解和补充(三)

前言

如果你没有看过之前的(一)或者没有下载这份手册的话,下面有链接,还是对照手册食用毕竟好。

http://www.cnblogs.com/linkstar/p/6413402.html

(二)的地址在下面,是关于异常和日志的。

http://www.cnblogs.com/linkstar/p/6415788.html

手册我特地在博客园文件中放了一份在线的仅供参考(因为好像发现最上面那个地址需要登录。。。)

https://files.cnblogs.com/files/linkstar/%E9%98%BF%E9%87%8CJava%E7%BC%96%E7%A8%8B%E8%A7%84%E8%8C%83.pdf

该说的我觉得(一)里面我都说完了,那么就直接进入正题吧。

 

Mysql规约

照例先讲废话:

mysql作为开源的数据库,因为其大小和功能等一直被人们所喜欢,所以用的人比较多,学习时我们也经常使用,对于小型项目来说,mysql很多时候已经足够用了,所以这里阿里给出的也是mysql的规范,对于其他的数据库来说也是一样的。但是,对于数据库的表名,字段名,sql语句,这些的规范对于设计数据库和开发来说是十分重要的,因为数据库和代码不同,代码可以修改,但是数据库的修改真的是“牵一发而动全身”,所以开发前还是仔细斟酌。

废话完了。

在下面先讲一个重点:MySQL中的数据库名和表名和操作系统有关,在windows操作系统中,不区分大小写,在unix ,linux操作系统中,是区分大小写的。这个坑我是踩过的,就是因为命名不规范的原因,有人在命名表的时候使用了大写字母(实际产生的表的名字还是小写),而且在sql语句中使用的也是大写字母,因为开发是在windows平台,一切正常,因为大小写不区分,所以执行的时候,大写字母自动变成小写,但是之后一到linux服务器上面,就炸炸炸!!!所以这就是为什么表的名字必须使用小写和下划线的原因。

 

建表规约

1、很多人会奇怪为什么会有这一条,我补充一句,合适的数据类型可以在省空间的同时避免你很多的错误。再附赠一张mysql数据类型和java数据类型对应的表,这张表挺好用的,等到你用多了之后,自然就能熟练对应了。

 

6、float和double在使用时会出现精度丢失的情况,使用decimal不会,但是要注意的是decimal的范围是你自己设置的,在平时的使用中尽量准确去估计你要使用的大小,(暂时还没有decimal不够用的情况)

 

9、自增id就不说了,唯一性约束,主要是说明一下gmt_create和gmt_modified字段,一开始看,我懵逼了,这是啥,也没说明是什么,后面想想一个是创建时间,一个是修改时间,gmt是格林尼治标准时间….好吧,我也有点醉醉的。个人认为是这样的,首先添加时间对于很多来说是需要的,对于很多业务来说很重要,而修改时间是为了后期万一出现问题反查数据检错用的。目前修改时间在我的项目中用的并不多,添加时间倒是几乎都有,之后会考虑加入修改时间,但是并非强制。

 

12、数据库不写注释的人,一抓一大把,真的是,每次去维护一个旧的项目,就会发现不写数据库注释的,你不写数据库注释对于别人来说,那么对于字段名表名将一脸懵逼。所以要养成良好的习惯,注释并非只有在代码中写的。

 

索引规约

千万不要忽视索引的重要性,一个数据库有没有索引查询的效率是非常不一样的,因为很多时候我们刚开始学习数据库的时候,可能索引只存在于课本或者视频,实际中感觉好像没用,其实主要原因是数据量小的时候你根本感觉不出没有索引的查询时有多么的慢,所以索引的重要性就要注意咯。

2、join,表连接是非常影响性能的,我曾经看到,一个设计非常不好的数据库交到一个程序员手里,结果这个程序员是个真码农,写了一个11张表连接的查询,结果可想而知,连在不大的数据情况下,打开页面都要1分钟。所以尽可能的连的少。

 

4、有人可能奇怪这一条,为什么左模糊或者全模糊都不行,那么右模糊是否可以呢?右模糊可以使用,为什么别的不行呢?因为别的效率真的很低,左模糊和全模糊的查询效率在数据量大的时候很慢,比右模糊要慢的多

$sql1 = "...... title like someTitle%" (花费0.001秒)
$sql2 = "...... title like %someTitle%" (花费0.8秒)

 

7、总结一句话,在写sql的时候,尽可能的先将容易被筛选的条件和那些可以去除掉很多不需要数据的条件先写(也就是第九条也提到的),使查询加快。延迟关联是也就是指,先加条件查询掉那些条件之后再去关联别的表去查询全部的数据,而不是关联之后再去查。

 

8、这条要求可能就比较严格了,作为我来说,暂时还没有那么数据量大的级别的项目需要进行所有的sql的优化,我只是对于那些访问量极高的,一个项目里面也就那么几个极其重要的sql进行特定的优化,主要也是优化查询的性能。对于sql性能优化来说,这种事情还是需要专业的DBA的,毕竟人家是吃这碗饭的,自己想到优化的点还是太少,网上有很多sql优化的讲述,我这里就不多说了。

 

SQL规约

3、sum还有max等函数,当使用这些函数进行查询的时候一定要注意,返回的可能是null,不过我的做法和手册给出的不同,因为在我的想法中数据库尽量是不能放逻辑代码的(后面我也会说到),当遇到这种情况时,我会使用包装类来接受数据库返回的结果,因为普通的int是不能为null的,因为是基本类型,而包装类Integer是可以为null,然后你只需要对这个对象进行判空即可,这样逻辑就存在于java代码中了。

 

6、很多学生,特别是学生,经常有疑问的就是,我在学校里面学习数据库的时候,老师常常交我们外键是什么,表里面外键是哪个,但是开发中从来不会有人跟你说外键,为什么?原因就在这里,外键造成的影响,首先是使表的情况你不可控,有时你完全不知道数据变化会导致怎么样的结果,还有就是影响数据库的性能,数据库每次都要管理你的外键,每次的插入还要去判断外键,等等,很多性能都浪费了,很多的约束和保证都已经由索引来完成了。

 

7、我并不是非常认同这个观点,至少我认为并发强制,原因是这样的,存储过程确实需要面对各种各样的问题,但是并不能一棒子打死,在某些特殊的地方,举个极端的例子,如果要运行的是1M的sql,而网络带宽还特别差,还要求你运行速度高,这样的情况下就可以使用存储过程,因为存储过程的sql是存放在服务器上面的,不需要通过网络进行传输,在网速很差的情况下也能有很高的速度,虽然这个例子可能有点极端,但是我想说明的就是这样一个意思,即使我到现在为止只用过一次,但是并不能说永远都不使用了。

 

10、表情使用utfmb4

 

ORM规约

1、只有懒惰的像猪的程序员才用select *

 

8、修改你需要的字段,不要的字段不要去修改

 

9、不要在类上面写@Transactional,我见过很多人偷懒,直接在类上面写@Transactional,这样导致这个类的每一个方法都采用了事务,但是实际上,很多时候是不需要事务的。

需要使用事务的情况:一、多次修改不同的数据。二、多次删除不同的数据。三、多种操作间存在关联性,前面操作失败会直接导致后面出现问题,且前面的操作不回滚会出现脏数据的情况。

事务是很影响执行时间的,所以要慎用,也要用的好。

 

总结和补充

这里还有几点需要补充的,这里没有提出触发器的问题,这个也是很多人问过我的,我的回答是,触发器不到万不得已不要使用,因为这东西和外键是一样一样的,很多时候都是会让你不可控制,而且维护起来非常难。还有就是数据库一定要备份。有bug不怕,一旦数据出问题,而且数据库恢复不出来的话,那就神也救不回来了。新闻也报道过很多次数据库的意外,特别是游戏的。

总之对于数据库,我们要学习的还有很多。我觉得手册的总结也是对于开发来说的,对于DBA可能要求比这个要多的多。所以如果你是DBA的话可能要了解的更加深入才行哦。

posted @ 2017-02-22 16:58  LinkinStar  阅读(2366)  评论(3编辑  收藏  举报