阿里巴巴开发手册笔记-----数据库篇

阿里巴巴开发手册笔记


阿里开发团队发表的java开发规范,下面我在学习了之后做一个简单的总结。此篇为数据库篇。

数据库

(一)建表约定

1.表达是与否的概念的字段,必须使用is_xxx的方式来命名。数据类型是 unsigned tinyint(1 表示是,0 表示否)。
说明:任何字段如果为非负数,必须是 unsigned。
注意:POJO 类中的任何布尔类型的变量,都不要加 is 前缀,所以,需要在设置从 is_xxx 到 Xxx 的映射关系。数据库表示是与否的值,使用 tinyint 类型,坚持is_xxx 的命名方式是为了明确其取值含义与取值范围。
正例:表达逻辑删除的字段名 is_deleted,1 表示删除,0 表示未删除。

2.表名、字段名必须使用小写字母或者数字,禁止出现数字开头,禁止两个下划线之间只出现数字。
说明:MySQL 在 Windows 下不区分大小写,但在 Linux 下默认是区分大小写。因此,数据库名、
表名、字段名,都不允许出现任何大写字母,避免节外生枝。
正例:aliyun_admin,rdc_config,level3_name
反例:AliyunAdmin,rdcConfig,level_3_name

3.表名不使用复数名词。
说明:表名应该仅仅表示表里面的实体内容,不应该表示实体数量,对应于 DO 类名也是单数
形式,符合表达习惯。

4.禁用保留字,如desc、range、match、delayed等

5.主键索引名为 pk字段名;唯一索引名为 uk字段名;普通索引名则为 idx_字段名。
说明:pk_ 即 primary key;uk_ 即 unique key;idx_ 即 index 的简称。

6.小数类型为 decimal,禁止使用 float 和 double。
说明:float 和 double 在存储的时候,存在精度损失的问题,很可能在值的比较时,得到不
正确的结果。如果存储的数据范围超过 decimal 的范围,建议将数据拆成整数和小数分开存储。

7.如果存储的字符串长度几乎相等,使用 char 定长字符串类型。

8.varchar 是可变长字符串,不预先分配存储空间,长度不要超过 5000,如果存储长
度大于此值,定义字段类型为 text,独立出来一张表,用主键来对应,避免影响其它字段索
引效率。

9.表必备三字段:id, gmt_create, gmt_modified。
说明:其中 id 必为主键,类型为 bigint unsigned、单表时自增、步长为 1。gmt_create,
gmt_modified 的类型均为 datetime 类型,前者现在时表示主动创建,后者过去分词表示被
动更新。

10.表的命名最好是加上“业务名称_表的作用”。
正例:alipay_task / force_project / trade_config

11.库名与应用名称尽量一致。

12.如果修改字段含义或对字段表示的状态追加时,需要及时更新字段注释。

(二)索引规范
1.业务上具有唯一特性的字段,即使是多个字段的组合,也必须建成唯一索引。

2.超过三个表禁止join,需要join的字段,数据类型必须绝对一致;多表关联查询时,保证被关联的字段需要有索引。

3.在varchar 字段上建立索引时,必须指定索引长度,没必要对全字段建立索引,根据
实际文本区分度决定索引长度即可。

4.页面搜索严禁左模糊或者全模糊,如果需要请走搜索引擎来解决。

5.利用覆盖索引来进行查询操作,避免回表。

(三)SQL语句

1.不要使用 count(列名)或 count(常量)来替代 count(),count()是 SQL92 定义的
标准统计行数的语法,跟数据库无关,跟 NULL 和非 NULL 无关。

2.count(distinct col) 计算该列除 NULL 之外的不重复行数,注意 count(distinct
col1, col2) 如果其中一列全为 NULL,那么即使另一列有不同的值,也返回为0.

3.当某一列的值全是 NULL 时,count(col)的返回结果为 0,但 sum(col)的返回结果为
NULL,因此使用 sum()时需注意 NPE 问题。

4.使用 ISNULL()来判断是否为 NULL 值。说明:NULL 与任何值的直接比较都为 NULL。

5.在代码中写分页查询逻辑时,若 count 为 0 应直接返回,避免执行后面的分页语句。

6.不得使用外键与级联,一切外键概念必须在应用层解决。

7.禁止使用存储过程,存储过程难以调试和扩展,更没有移植性。

8.数据订正(特别是删除、修改记录操作)时,要先 select,避免出现误删除,确认
无误才能执行更新语句。

9.in 操作能避免则避免,若实在避免不了,需要仔细评估 in 后边的集合元素数量,控
制在 1000 个之内。

(四)ORM映射
1.在表查询中,一律不要使用 * 作为查询的字段列表,需要哪些字段必须明确写明。
说明:1)增加查询分析器解析成本。2)增减字段容易与 resultMap 配置不一致。3)无用字
段增加网络消耗,尤其是 text 类型的字段。

2.POJO 类的布尔属性不能加 is,而数据库字段必须加 is_,要求在 resultMap 中进行
字段与属性之间的映射。

3.不要用 resultClass 当返回参数,即使所有类属性名与数据库字段一一对应,也需
要定义;反过来,每一个表也必然有一个 POJO 类与之对应。

4.sql.xml 配置参数使用:#{},#param# ,不要使用${} 此种方式容易出现 SQL 注入。

5.不允许直接拿 HashMap 与 Hashtable 作为查询结果集的输出。

6.修改更新时无需修改无改动的字段。

7.@Transactional 事务不要滥用。事务会影响数据库的 QPS,另外使用事务的地方需
要考虑各方面的回滚方案,包括缓存回滚、搜索引擎回滚、消息补偿、统计修正等。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值