1.1库名、表名、字段名必须使用大写字母,不要使用驼峰命名,并采用下划线分割
MySQL有配置参数lower_case_table_names=1,即库表名以小写存储,大小写不敏感。如果是0,则库表名以实际情况存储,大小写敏感;如果是2,以实际情况存储,但以小写比较
在Unix上,默认值为 lower_case_table_names 为 0 ,在 Windows 上,默认值为 1,在 macOS 上,默认值为 2 。
为了统一规范, 库名、表名、字段名使用大写字母
正例:T_SALEORDER SALEORDER_ID
反例:t_saleOrder userId
1.2库名可添加数据库环境作为开头,表名以 t 开头 (重写的功能用V开头)
参考:
DEV:开发环境,开发可读写,可修改表结构。开发人员可以修改表结构,可以随意修改其中的数据但是需要保证不影响其他开发同事。
QA:测试环境,开发可读写,开发人员可以通过工具修改表结构。
SIM:模拟环境,开发可读写,发起上线请求时,会先在这个环境上进行预执行,这个环境也可供部署上线演练或压力测试使用。
REAL:生产数据库从库(准实时同步),只读环境,不允许修改数据,不允许修改表结构,供线上问题查找,数据查询等使用。
ONLINE:线上环境,开发人员不允许直接在线上环境进行数据库操作,如果需要操作必须找DBA进行操作并进行相应记录,禁止进行压力测试。
1.3.库名、表名、字段名禁止超过32个字符,需见名知意(禁止中英混写)
1.4.按日期时间分表须符合_YYYYMMDD格式
例如:ERP_VEDENG_COM_20170301
1.5.临时库、表名必须以TMP为前缀,并以日期为后缀,备份库、表必须以BAK为前缀,并以日期为后缀
库表基础规范
2.1.使用Innodb存储引擎
2.2.表字符集统一使用UTF8,校对字符集使用默认的 utf8_general_ci
2.3.所有表都要添加注释,所有字段都要添加注释
描述该字段的用途及可能存储的内容,如枚举值则建议将该字段中使用的内容都定义出来
例如:0-离线,1-在线
2.4.控制单表字段数量,单表字段数上限50个
2.5.所有表都必须要显式指定主键
如果没有主键或唯一索引,update/delete是通过所有字段来定位操作的行,相当于每行就是
一次全表扫描
2.6.禁止使用外键,如果有外键完整性约束,需要应用程序控制
即使2个表的字段有明确的外键参考关系,也不使用 FOREIGN KEY ,因为新增会去主键表做校验,影响性能。
2.7.禁止使用存储过程、视图、触发器、Event
字段规范
3.1.建议字段都定义为NOT NUL并设置默认值(数值型可以设置0,字符串可以设置“”或emptyString)
3.2.存储精确浮点数要使用DECIMAL替代FLOAT和DOUBLE
float,double容易产生误差,对精确度要求比较高时,建议使用decimal来存,
decimal在mysql内存是以字符串存储的,用于定义货币要求精确度高的数据
3.3.枚举状态优先使用tinyint (-128,127)
3.4.禁止在数据库中使用Varbinary,Blob存储图片,文件等
只存图片文件的url即可
3.5.varchar是可变长字符串,长度不要超过 5000,如果存储长度大于此值
定义字段类型为 text,独立出来一张表,用主键来对应,避免影响其它字段索引效率。
3.6.如果修改字段含义或对字段表示的状态追加时,需要及时更新字段注释
3.7.同一意义的字段定义必须相同(不同表中类型、字段长度要设计成一样)
NEWERP库表新增规范:
1.时间 类型统一使用 datetime, 名称使用_TIME结尾,查询语句涉及到当前时间,使用now().
2.业务表都要有:ADD_TIME,CREATOR,MOD_TIME,UPDATER
3.所有库表以V_开头便于跟老erp的区分。
4.索引命名规范: IDX_表名_1,IDX_表名_2,IDX_表名_3… UNIQ_表名_1,UNIQ_表名_2,UNIQ_表名_3…
5.字段含义: STATUS 仅代表数据的有效性,不要与业务相关,1启用 0禁用
其他与业务状态相关的字段,都用 xxx_STATUS表示。 如CHECK_STATUS ,ORDER_STATUS,
6.外键注释,指明对应的表名
类型注释,如果关联系统参数表,指明参数表的查询条件
7.关于varchar字段的长度设置,如果确定不会超过255,或者不差这一个字节的长度,不要设置为256,设置为255即可。
- V_CORE_GOODS V_CORE_COMPANY V_CORE_XXX (业务核心相关的表,如产品公司等)
V_SYS_PARAMETER V_SYS_XXTYPE (系统相关的表 ,权限等)
V_BASE_CATEGORY V_BASE_X (基础数据,与业务关系不大,变动不多)
其他非核心表 尽量用模块名开头
V_ORDER_XX_LOG
V_INVOICE_
Mysql的sql编写规范
Sql语句的格式
4.1 语句中出现的所有表名、列名全部大写,系统保留字、内置函数名、SQL保留字大写
例如:SELECT/DELETE/INSERT/UPDATE/FROM/WHERE/IN/ON 等
4.2所有查询语句中出现的所有表名 必须有别名,以小写的a-z依次命名,所有字段名以实体类中对应字段命名用驼峰写法首字母小写
4.3 多表连接时必须使用别名,可以减少解析时间并减少列名歧义引起的语法错误
4.4. SQL语句内的算术运算符、逻辑运算符(AND、OR、NOT)、 比较运算符(=、<=、>=、>、<、<>、BETWEENAND)、IN、LIKE等运算符前后都应加一空格
4.5. SQL 语句中逗号后应加一空格
4.6.SQL以4个空格来缩进 详情如下图
SQL编写注意点
5.1. 杜绝直接 SELECT * 读取全部字段
正例:select username,email from system_user where age>10
反例:select * from system_user where age>10
5.2. 能确定返回结果只有一条时,使用 limit 1
5.3.小心隐式类型转换
转换规则
1.两个参数至少有一个是 NULL 时,比较的结果也是 NULL,例外是使用<=>对两个 NULL 做比较时会返回 1,这两种情况都不需要做类型转换
2. 两个参数都是字符串,会按照字符串来比较,不做类型转换
3. 两个参数都是整数,按照整数来比较,不做类型转换
4. 十六进制的值和非数字做比较时,会被当做二进制串
5. 有一个参数是 TIMESTAMP 或 DATETIME,并且另外一个参数是常量,常量会被转换为 timestamp
6. 有一个参数是 decimal 类型,如果另外一个参数是 decimal 或者整数,会将整数转换为 decimal 后进行比较,如果另外一个参数是浮点数,则会把 decimal 转换为浮点数进行比较
7. 所有其他情况下,两个参数都会被转换为浮点数再进行比较。
5.4.禁止在where条件列上使用函数
会导致索引失效
5.5.减少与数据库交互的次数,尽量采用批量SQL语句
反例:
INSERT INTO system_user (username,passwd) VALUES (‘test’,‘123456’)
INSERT INTO system_user (username,passwd) VALUES (‘test1’,‘123456’)
INSERT INTO system_user (username,passwd) VALUES (‘test2’,'123456’)
正例:
INSERT INTO system_user (username,passwd) VALUES (‘test’,'123456’), (‘test1’,'123456’) , (‘test2’,'123456’)
5.6. INSERT语句必须显式的指明字段名称,不使用INSERT INTO table()
表中字段新增或删除之后容易出错
5.7. xml配置中参数注意使用:#{},不要使用${} 此种方式容易出现 SQL注入
#{}是把参数当字符串来使用, ${}是直接使用参数