前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据库设计原则与开发规范,你知道多少?

数据库设计原则与开发规范,你知道多少?

作者头像
ITester软件测试小栈
发布2020-12-31 10:06:52
1.5K0
发布2020-12-31 10:06:52
举报
文章被收录于专栏:全栈测试全栈测试

VOL 187

21

2020-12

今天距2021年11天

这是ITester软件测试小栈第187次推文

本文4352字,阅读约需11分钟

对一个程序来说,由于数据库资源的绝对宝贵性(无法无限扩展),所以数据库必须合理的运行使用。以保证高效、稳定、安全的运行。数据库设计得好, 系统健步如飞;数据库设计不好,系统蹒跚前行。今天介绍数据库的设计原则和规范,你知道得越多,你不知道的越多。你知道多少呢?

MySQL数据库设计原则

1

核心类原则

1.不在数据库做运算;

2.cpu计算务必移至业务层ecs

3.控制列数量(字段少而精,字段数建议在60以内);

4.平衡范式与冗余(效率优先;往往牺牲范式,但不要过度冗余);

5.拒绝大sql语句、拒绝大事物、拒绝大批量;

2

数据库原则

1.建议单库不超过100个表;

2.建议单表数据量不超过100w;

3.重要数据和不重要数据最好不要存在一个库中;

4.数据库字段如果有中文,建议为接口中字段长度的3倍;

3

基本表原则

基本表与中间表、临时表不同,因为它具有如下四个特性

  • 原子性:基本表中的字段是不可再分解的;
  • 原始性:基本表中的记录是原始数据(基础数据)的记录;
  • 演绎性:由基本表与代码表中的数据,可以派生出所有的输出数据;
  • 稳定性:基本表的结构是相对稳定的,表中的记录是要长期保存的;
代码语言:javascript
复制

4

字段类原则

1.尽量使用数值类型(用合适的字段类型节约空间);

2.字符转化为数字(能转化的最好转化,同样节约空间、提高查询性能);

3.尽量使用not null;

4.少用text类型(尽量使用varchar代替text字段);

5.字段需要清晰的comment;

6.建议单表字段数上限控制在20~50个;

7.禁止同一个字段在不同的表之间用不同的数据类型;

5

索引类原则

1.合理使用索引(改善查询,减慢更新,索引一定不是越多越好);

2.字符字段必须建前缀索引;

3.不在索引做列运算;

4.innodb主键推荐使用自增列

5.禁止使用外键(由程序保证约束);

6.尽量不要使用唯一约束(无法利用mysql、的插入缓冲,造成插入性能慢);

7.大字段不宜索引,分区表 无法使用全文索引;

6

业务类原则

1.解耦合,模块之间尽量减少相互依赖,相互调用;

2.解耦合,接口之间禁止重复利用同一个查询接口;

3.保证事务的原子性,一致性;

4.保证数据完整性,安全性,有效性,防止非法用户使用数据库或合法用户非法使用数据库造成数据泄露、更改或破坏,防止不同模块用户交叉使用,敏感数据及早加密;

5.可伸缩性与可扩展性原则:数据库结构的设计应充分考虑发展的需要、移植的需要,具有良好的扩展性、伸缩性和适度冗余;

6.规范化:数据库的设计应遵循规范化理论,规范化的数据库设计可以减少数据库插入、删除、修改等操作时的异常和错误,降低数据冗余度等;

7

SQL类原则

1.sql语句尽可能简单; 2.简单的事务;

3.不用select *(消耗cpu,io,内存,带宽,这种程序不具有扩展性);

4.OR改写为IN(or的效率是n级别); 5.OR改写为UNION;

6.避免负向%;

7.慎用count(*);

8.limit高效分页(limit越大,效率越低);

9.使用union all替代union(union有去重开销);

10.少用连接join;

11.使用group by; 12.请使用同类型比较; 13.打散批量更新;

8

巧用性能分析工具

1.show profile; 2.mysqlsla; 3.mysqldumpslow; 4.explain; 5.show slow log; 6.show processlist;

MySQL数据库开发规范

1

常用规则

1.最少返回原则,数据库查询返回客户端数据是需要网络传输开销的,可能本来不需要读取这些列,但因为偷懒写成 SELECT * 导致内存buffer pool被这些“垃圾”数据把真正需要缓冲起来的热点数据给洗出去了。导致其他查询性能变慢;

2.一对一原则,每个查询接口只对接一个应用接口,禁止重复使用同一个查询接口,这对后期的影响是巨大的,跷跷板反应;

3.隐式转换、禁止使用隐式转换,这可能带来一些意外;

4.尽量避免全表扫描的情况;

5.避免三个表以上的关联;

6.大表查询,需要提前告知DBA;

7.where条件中按索引顺序写;

8.核心查询必须使用到索引,优先使用覆盖索引;

9.hash索引只有在等于的时候才有效;

10.经常使用EXPLAIN诊断,避免生成临时表,文件系统排序;

11.谨慎使用大表分页;

12.尽量不要一次查询过多数据,缩小查询范围;

13.排序字段一定要属于驱动表,才能利用驱动表上的索引完成排序;

2

索引禁忌与限制

1.不在离散度低的列上新建索引;

2.不在索引上做运算,函数操作;

3.like通配符开头,无法使用到索引;

4.类型转换,索引失效;

5.谨慎范围查询,只有第一列能真正使用到索引;

6.索引不宜过多,索引提升了查询性能,但降低了插入和更新性能;

7.索引尽量为少更新,如果到一定程度后,优化器将放弃索引走全表扫描;

8."!=", "!>", "!<", "NOT", "NOT EXISTS", "NOT IN", "NOT LIKE",like %aaa%‟ 尽量不用;

3

DML

1.禁止单个sql更新多个表;

2.所有更新必须使用到索引(实现高并发,减少锁资源争抢);

3.禁止使用delete,程序用户无delete权限;

4.禁止在DML中使用limit;

4

DDL

1.DDL 请使用Yearning工单,Yearning有DDL自动审核机制,会自动选则使用online 还是第三方工具;

2.多个DDL 能合并则尽量合并(减小代价);

3.DDL 统一安排在晚上;

5

TCL

1.核心部分,请使用事务,保证数据的一致性;

2.非核心部分业务,可拆分大事务,减少锁定时间;

6

排版与注射

1.SQL语句请格式化,Navicat可美化SQL,总的原则是使代码清晰可读;

2.注释尽可能详细、全面,并且将注释放在实现代码的前面,提高可读性;

MySQL数据库设计规范

1

数据库命名规范

1.采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线_作为数据库名; 2.命名尽量简洁明确(长度不能超过30个字符); 例如:user, stat, log, 也可以wifi_user,wifi_log,wifi_stat给数据库加个前缀;

3.除非是备份数据库可以加0-9的自然数:user_db_2021220;

2

数据表命名规范

1.基本表:采用26个英文字母和0-9的自然数加上下划线'_'组成,命名尽量简洁明确,多个单词用下划线'_'分隔,同一块业务,开头需要保持一致,要做到看到表名知道表的来源;

例如:user_login, user_profile, user_detail, user_role, user_role_relation,user_role_right, user_role_right_relation;

2.关系表:例如以 rel_ 开头 或者 _rel 结尾,命名简洁明确,关系一看明了;

3.表必须有清晰的comment;

4.系列表需保持开头一致;

3

数据库的字段名命名规范

1.采用26个英文字母和0-9的自然数加上下划线'_'组成,一般不超过3个单词; 2.命名简洁明确,多个单词用下划线'_'分隔; 例如:user_login表字段 user_id, user_name, pass_word, eamil, status, mobile, add_time; 3.每个表中必须有自增主键,add_time(默认系统时间); 4.表与表之间的相关联字段名称要求尽可能的相同;

5.每个表必须包含固定字段,逻辑删除,创建时间,创建人,修改时间,修改人,备注;

6.每个字段必须清晰写明comment,并在修改时,及时更新comment;

7.将离散度高的列往前放,创建索引按列的顺序,查询按列的顺序查询,保持三者一致;

8.不得使用MySQL关键字,保留字;

4

数据库的字段类型规范

1.用尽量少的存储空间来存数一个字段的数据; 例如:能使用int就不要使用varchar、char,能用varchar(16)就不要使用varchar(256); 2.IP地址最好使用int类型; 3.固定长度的类型最好使用char,例如:邮编; 4.能使用tinyint就不要使用smallint,int; 5.最好给每个字段一个默认值,最好不能为null;

5

数据表索引规范

1.命名简洁明确,例如:user_login表user_name字段的索引应为user_name_index唯一索引; 2.为每个表创建一个主键索引; 3.为每个表创建合理的索引; 4.建立复合索引请慎重;

6

数据库三范式

第一范式(1NF):字段值具有原子性,不能再分(所有关系型数据库系统都满足第一范式); 例如:姓名字段,其中姓和名是一个整体,如果区分姓和名那么必须设立两个独立字段; 第二范式(2NF):一个表必须有主键,即每行数据都能被唯一的区分; 备注:必须先满足第一范式;

第三范式(3NF):一个表中不能包涵其他相关表中非关键字段的信息,即数据表不能有沉余字段; 备注:必须先满足第二范式;

以上

That‘s all

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-12-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ITester软件测试小栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档