<返回更多

数据库规范开发使用规范

2023-01-17  今日头条  时空过客vicyuppie
加入收藏

1 概述

1.1 目的

鉴于以往各方在数据库设计和使用方面的经验总结,本规范的以下内容是为了保证数据库设计及使用的质量,规范数据库设计及使用习惯,从而提高程序开发效率,提升平台服务质量。长期坚持并严格遵守规范,从长远来看,于公于私都是双赢的事情。

1.2 适用范围

1.3 现有数据库的问题

目前数据库中存在的问题:

1.4 概念说明

l 强制: 必须遵守。

l 推荐: 最佳实践,建议遵守。

l 参考: 可选遵守。

2 数据库设计规范

2.1 总体目标

数据库设计总体目标:

2.2 设计规范

2.2.1 表设计规范

`CREATE_TIME` datetime NOT NULL COMMENT '创建时间'

`CREATE_ACCT_ID` bigint(20) NOT NULL COMMENT '创建人账户ID'

`UPDATE_TIME` datetime NOT NULL COMMENT '更新时间'

` UPDATE_ACCT_ID` bigint(20) NOT NULL COMMENT '更新人账户ID'

在平衡范式与反范式的过程中,应当考虑数据在业务场景中的使用方式,对于访问频次高而修改频次很低的数据,设计过程中可以考虑反范式处理,但禁止冗余varchar 超长字段,更不能是 text 字段。对于修改频次高而访问频次很低的数据,设计过程中应当遵循3NF。数据库表的整体设计还是以3NF为基础,然后再根据整个应用系统的需要反范式化数据。

2.2.2 字段设计规范

2.2.3 其他设计规范

Mysql中键包括primary key, unique key, foreign key 等,是数据库的物理结构,有两方面的用途:一是约束,侧重于数据库的完整性约束,二是索引,用于优化查询。换言之,每个键除了规范约束的功能,同时也有索引的功能。

键和索引设计要遵循如下原则:

2.3 命名规范

2.3.1 总则

2.3.2 数据库命名

数据库名称以小写英文字母和数字命名,以下划线_分割,名称要涵盖主要的业务职能,长度不要超过10个字符。

2.3.3 表命名

<项目名称>_<模块名称>_<表名称>

表名称要以小写英文字母和数字命名,以下划线_分割,能简单描述该表的基本职能,表名不使用复数名词。

项目名称要简短,最好用字母缩写。

模块名称要简要,可以用缩写,可以用核心词拼接。

2.3.4 字段命名

字段名称以大写英文字母和数字命名,以下划线_分割,字段名称及其注释要指明业务含义,做到用词准确,表达无歧义。

2.3.5 其他命名

UK_<构成主键的字段名称>

IDX_<构成索引的字段名称>

3 SQL开发规范

3.1 脚本编写规范:

INSERT INTO `goods`.`goods_info`(`GOODS_ID`, `ITEM_ID`, `SOURCE_TYPE`, `PUBLISH_POSITION`, `STORE_ID`, `SELLER_GOODS_ID`, `SELLER_SNAPSHOT_GOODS_ID`, `CHANNEL_ID`, `AVAILABLE_STOCK`, `DAILY_CAPACITY`, `MIN_PURCHASE_NUM`, `MATERIAL_ID`, `MATERIAL_CODE`, `MATERIAL_SNAPSHOT_ID`, `SALE_CNT`, `UNIT_PRICE`, `SUPPLY_PRICE`, `STATUS`, `SALE_STATUS`, `STOP_SALE_REASON`, `MOD_TIME`, `MOD_ACCT_ID`, `CREATE_TIME`, `CREATE_ACCT_ID`, `AppROVE_TIME`, `APPROVE_ACCT_ID`, `APPROVE_DESC`, `WARNING_NUM`, `UNQUALIFIED_STOCK`, `PLATFORM_UNQUALIFIED_STOCK`, `PLATFORM_QUALIFIED_STOCK`, `WMS_STOCK`) VALUES (100000000, 100000000, 1, 0, NULL, 100000000, 100000000, 1, 963329.000, NULL, NULL, 17, '1', 17, 420524.000, NULL, 89.04, 1, 1, NULL, '2021-02-02 09:22:34', 100011805, '2018-06-22 14:36:35', 302, NULL, NULL, NULL, 1.000, 0.000, 0.000, 830955.000, 0.000);

3.2 WHERE条件规范:

3.3 脚本使用行为规范:

减少或避免使用临时表。当ORDER BY子句和GROUP BY子句同时出现且字段列表不同则会自动创建临时表;当ORDER BY子句或GROUP BY子句的字段列表中的字段超出驱动表,则自动创建临时表。

减少或避免排序,如无法避免,尽量在索引列中完成排序。

避免HAVING子句,尽量将条件放到WHERE子句中。

说明: count( * ) 会统计值为 NULL 的行,而count(列名)不会统计此列为 NULL 值的行。

正例:先快速定位需要获取的 id 段,然后再关联:

SELECT a.* FROM 表 1 a, (SELECT id FROM表1 WHERE条件 LIMIT OFFSET, N) b where a.id=b.id;

说明:1 )consts 单表中最多只有一个匹配行 ( 主键或者唯一索引 ) ,在优化阶段即可读取到数据。2 )ref 指的是使用普通的索引 (normal index) 。3 )range 对索引进行范围检索。

反例: explain 表的结果, type = index ,索引物理文件全扫描,速度非常慢,这个 index 级别比较 range 还低,与全表扫描相差不多。

4 数据库帐号使用规范

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>