欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

工作总结:数据库PO与建表规约【强制】

程序员文章站 2022-04-14 09:09:40
...

参考了:阿里巴巴Java开发手册

PO

  1. 整型字段定义为Integer

  • 说明: int 类型默认值为0,不利于mybatils的动态sqlInteger默认值为null
  • 注意: IntegerInt比较直接拆箱,可以相等;Integernew Integer()始终不会像等(==);IntegerInteger比较时,被转化为Integer.valueof(值),查看源码,常量缓存范围为-128~127,所以超出范围则不相等(==)。
  1. 精度计算的值禁止使用floatdouble,改用String类型,计算时转化为BigDecimal

  • 说明: floatdouble会产生精度缺失
  1. 定义PO时,如果某些字段需要参与计算,参考1&2 两项进行类型定义

  2. PO采用驼峰命名,例如:servicePackage


Table&Field

  1. 表、字段名不使用复数名词

  2. 表、字段名禁用Mysql保留字,例如:

  • desc/match/delayed/range/state
  1. 表、字段名必须使用小写字母或数字,数字禁止出现在开头,禁止出现在下划线之间,如:“table_3_table2”、“column_3_column1


Table

  1. 表的命名最好是:“业务名_表的作用”

  2. “业务名_表的作用”,可以作——OneMany,例如:

  • certificate_tag /*资质标签 only one for many certificates */
  • certificate_tag /*资质标签 only Many for many providers of certificate */
  • service_process /* 服务流程 only many for single service */
  1. Many_Many必须创建中间表,命名为“table1Name_table2Name”如:“provider_certificate_tag”、“service_order_evaluate_tag”。

  • 注意: 1. 如果table1Name等于table2Name的前半部分,则可用table2Name加“_and_”作为中间表名
  • 例如: serviceservice_loopservice_and_loop
  • 注意: 2. 如果table1Name与table2Name中都没有下划线,则可用“table1Name_and_table2Name”作为中间表名
  • 例如: providerserviceprovider_and_service

Field

  1. 表达Boolean的字段,必须使用 is _ xxx 的方式命名,数据类型是unsigned tinyint()。

  2. 小数类型为decimal ,禁止使用 float 和 double,会发生精度缺失。

  • 注意: 类型长度=整数长度+小数长度小数点不占位、自动舍入
  1. 表必备三字段:id(主键) , gmt _ create(创建时间) , gmt _ modified(修改时间) 。

  • 说明: 其中 id 必为主键,类型为 unsigned bigint 、单表时自增。 gmt _ create , gmt _ modified的类型均为 date _ time 类型,必要时可存储为varchar
  1. 主键、字段类型的选择需要特殊注意:

  • 主键命名: 为 id,为 表的作用_id
  • 主键类型: 可以采用标记+时间戳+随机数 ,varchar,为unsigned bigint ,自增
  • 字段类型: 只注意两点: 数字非数字格式非格式,即,同时满足两种情况,即可完成静默转化,无需担心PO字段的定义类型,这是#{ }表达式,能够给参数自动包装' ',字符串化参数,也是String类型存储成datetime依赖条件,甚至浮点 会 牺牲精度 被 强制转化成整形
  1. varchar如果存储长度大于5000,可以更为text,例如**,必要时可以独立出来一张表,用主键来对应,避免影响其它字段索引效率。

  2. Unsigned Int 无符号值可以避免误存负数,且扩大了表示范围。

  • unsigned tinyint 无符号值:0~255
  • unsigned smallint 无符号值:0~65535
  • unsigned int 无符号值:0~ 42.9亿
  • unsigned bigint 无符号值:0~约10^19
  1. 字段允许适当冗余,以提高查询性能,但必须考虑数据一致。冗余字段应遵循:

  • 频繁使用 却 不频繁修改
  • 不是 varchar 超长字段,更不能是 text字段。
  1. Mybatils 映射,不区分大小写

  2. 实现 数据库列名 Column 如 “delivery_address” 到 PO 驼峰字段名 "deliveryAddress"的映射,有三种途径:

  • //别名法
select delivery_address as deliveryAddress from table
  • //resultMap手动配置
<!-- resultMap手动配置 -->
<resultMap>
 <result property="deliveryAddress" column="delivery_address"/>
</resultMap>
  • //Mybatils-Config.xml中全局配置mapUnderscoreToCamelCase
<settings>
  <setting name="autoMappingBehavior" value="PARTIAL"/><!-- 默认值PARTIAL——— 将自动映射结果,除了那些有内部定义,内嵌结果映射,的(joins).-->
  <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>