您当前的位置:首页 > 电脑百科 > 数据库 > 百科

浅谈数据库设计与创建规范

时间:2021-08-04 09:48:05  来源:  作者:富集云科技有限公司

1.总则

为规范公司各环境中数据库系统的设计与创建流程,提高数据库系统的开发效率,保障数据库系统性能和安全稳定的运行,特制定本规范。

该规范涉及PM,RD,SQ,DBA四个角色,每个角色在数据库系统设计与创建过程中的工作内容会按照【高危】、【强制】、【建议】三个级别进行标注,遵守优先级从高到低。

对于不符合【高危】和【强制】两个级别的工作内容,DBA会强制打回要求修改。

2.适用范围

本规范所定义的数据库系统包括部署在传统数据中心(Cisco UCS 等物理机)和云(公有云、私有云)上的所有数据库实例,相关数据库实例参照相关规范进行数据库开发与创建的工作。

3.PM需遵守的数据库设计与创建规范

本规范旨在帮助或指导RD、QA、OP等技术人员做出适合线上业务的数据库设计和开发。在数据库变更和处理流程、数据库表设计、SQL编写等方面予以规范,从而为公司业务系统稳定、健康地运行提供保障。

3.1 MySQL设计开发规范

MySQL数据库与 Oracle、 SQL Server 等商用数据库相比,有其内核上的优势与劣势。我们在使用MySQL数据库进行设计开发的时候需要遵循一定规范,扬长避短。

3.1.1 命名规范

数据库对象的命名规则的范围为管理平台设计开发所涉及的表,对于其他外部系统所创建的表不在本规范约束范围内,

数据库对象如表、列、序列、过程、函数等在命名时要遵循如下规则:

【强制】命名要使用富有意义中英文缩写,要以字母开头,不能超过32个字符。

【强制】命名必须使用小写字母,

【强制】数据库对象名称由如下部分组成:范围、类型、名称实体,各词汇间采用下划线“_”连接。

【强制】其中各数据库对象的范围和类型的具体含义及取值详见各数据库对象的命名规则。

数据库对象命名规则

【强制】数据库对象的名称不允许是数据库的 保留字 和 关键字

SELECT id, name, from, age FROM user 不可以

保留字和关键字详见连接

Option/Variable Reference

3.1.2 建库规范

【强制】创建数据库时必须显式指定字符集,并且字符集只能是utf8或者utf8mb4。创建数据库SQL举例:

create database db1 default character set utf8;

3.1.3 建表规范

【强制】创建表时必须显式指定字符集为utf8或utf8mb4。

【强制】创建表时必须显式指定表存储引擎类型,如无特殊需求,一律为InnoDB。当需要使用除InnoDB以外的存储引擎时,必须通过DBA审核才能在生产环境中使用。因为Innodb表支持事务、行锁、宕机恢复、MVCC等关系型数据库重要特性,为业界使用最多的MySQL存储引擎。而这是其他大多数存储引擎不具备的,因此首推InnoDB。

【强制】建表必须有comment,从一开始就进行数据词典的维护。类status型需指明主要值的含义,如”0-离线,1-在线”

【强制】中间表用于保留中间结果集,名称必须以tmp_开头。备份表用于备份或抓取源表快照,名称必须以bak_开头。中间表和备份表定期清理。

【强制】对于超过100W行的大表进行alter table,必须经过DBA审核,并在业务低峰期执行。因为alter table会产生表锁,期间阻塞对于该表的所有写入,对于业务可能会产生极大影响。

【建议】建表时关于主键:(1)强制要求主键为id,类型为int或bigint,且为auto_increment;(2)标识表里每一行主体的字段不要设为主键,建议设为其他字段如user_id,order_id等,并建立unique key索引。因为如果设为主键且主键值为随机插入,则会导致innodb内部page分裂和大量随机I/O,性能下降。

【建议】核心表(如用户表,金钱相关的表)必须有行数据的创建时间字段create_time和最后更新时间字段update_time,便于查问题。

【建议】建议对表里的blob、text等大字段,垂直拆分到其他表里,仅在需要读这些对象的时候才去select。

【建议】反范式设计:把经常需要join查询的字段,在其他表里冗余一份。如user_name属性在user_account,user_login_log等表里冗余一份,减少join查询。

3.1.4 字段规范

【建议】表中所有字段必须都是NOT NULL属性,业务可以根据需要定义DEFAULT值。因为使用NULL值会存在每一行都会占用额外存储空间、数据迁移容易出错、聚合函数计算结果偏差等问题。如果不能保证insert时一定有值过来,定义时使用default值 ‘ ’ 或 0。

使用NUMBER类型是必须指定长度。由NUMBER得到精度与密度来保障数据的一致性

表中字段的命名长度不应该超过30个字节

【建议】表中的自增列(auto_increment属性),推荐使用bigint类型。因为无符号int存储范围为-2147483648~2147483647(大约21亿左右),溢出后会导致报错。

【建议】业务中选择性很少的状态status、类型type等字段推荐使用tinytint或者smallint类型节省存储空间。

【建议】业务中IP地址字段推荐使用int类型,不推荐用char(15)。因为int只占4字节,可以用如下函数相互转换,而char(15)占用至少15字节。一旦表数据行数到了1亿,那么要多用1.1G存储空间。
SQL:select inet_aton('192.168.2.12'); select inet_ntoa(3232236044);
php: ip2long(‘192.168.2.12’); long2ip(3530427185);

【建议】不推荐使用enum,set。 因为它们浪费空间,且枚举值写死了,变更不方便。推荐使用tinyint或smallint。

【建议】不推荐使用blob,text等类型。它们都比较浪费硬盘内存空间。在加载表数据时,会读取大字段到内存里从而浪费内存空间,影响系统性能。建议和PM、RD沟通,是否真的需要这么大字段。Innodb中当一行记录超过8098字节时,会将该记录中选取最长的一个字段将其768字节放在原始page里,该字段余下内容放在overflow-page里。不幸的是在compact行格式下,原始page和overflow-page都会加载。

【建议】存储金钱的字段,建议用int,程序端乘以100和除以100进行存取。因为int占用4字节,而double占用8字节,空间浪费。

【建议】文本数据尽量用varchar存储。因为varchar是变长存储,比char更省空间。MySQL server层规定一行所有文本最多存65535字节,因此在utf8字符集下最多存21844个字符,超过会自动转换为mediumtext字段。而text在utf8字符集下最多存21844个字符,mediumtext最多存2^24/3个字符,longtext最多存2^32个字符。一般建议用varchar类型,字符数不要超过2700。

【建议】时间类型尽量选取timestamp。因为datetime占用8字节,timestamp仅占用4字节,但是范围为1970-01-01 00:00:01到2038-01-01 00:00:00。更为高阶的方法,选用int来存储时间,使用SQL函数unix_timestamp()和from_unixtime()来进行转换。



Tags:数据库设计   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
1.总则为规范公司各环境中数据库系统的设计与创建流程,提高数据库系统的开发效率,保障数据库系统性能和安全稳定的运行,特制定本规范。该规范涉及PM,RD,SQ,DBA四个角色,每个角色...【详细内容】
2021-08-04  Tags: 数据库设计  点击:(57)  评论:(0)  加入收藏
文作者为 PingCAP 联合创始人兼 CTO 黄东旭,将分享分布式数据库的发展趋势以及云原生数据库设计的新思路。 在讲新的思路之前,先为过去没有关注过数据库技术的朋友们做一个简...【详细内容】
2021-01-12  Tags: 数据库设计  点击:(154)  评论:(0)  加入收藏
数据模型传统的关系型数据库,一张表(table)由行(row)和列(column)组成。相对Hbase分布式数据库却有所差别,可以把Hbase中的表理解成不同维度Map的集合。包含以下主要概念。 ta...【详细内容】
2020-10-29  Tags: 数据库设计  点击:(166)  评论:(0)  加入收藏
概述MySQL数据库与 Oracle、 SQL Server 等数据库相比,有其内核上的优势与劣势。我们在使用MySQL数据库的时候需要遵循一定规范,扬长避短。无意中从github上看到一个大佬的MyS...【详细内容】
2020-10-27  Tags: 数据库设计  点击:(93)  评论:(0)  加入收藏
一个成功的管理系统,是由:[50% 的业务 + 50% 的软件] 所组成,而 50% 的成功软件又有 [25% 的数据库 + 25% 的程序] 所组成,数据库设计的好坏是一个关键。如果把企业的数据比做生...【详细内容】
2020-06-06  Tags: 数据库设计  点击:(91)  评论:(0)  加入收藏
众所周知,良好的数据库设计能够大幅减少后期的运维工作,同时也能最大程度地减少软件项目出错的可能。由于我们所面临的真实项目需求往往五花八门,因此需要找到合适的设计工具,来...【详细内容】
2020-03-04  Tags: 数据库设计  点击:(92)  评论:(0)  加入收藏
小团队作战经常是上来就是随便打下草稿,然后三七二十一使用图形化工具把数据库表结构建起来了,根本就没有写像下面这种数据库设计文档后,才进行代码编写工作。 但是随着项目的...【详细内容】
2019-12-29  Tags: 数据库设计  点击:(69)  评论:(0)  加入收藏
1. 原始单据与实体之间的关系可以是一对一、一对多、多对多的关系。在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体。在特殊情况下,它们可能是一对多或...【详细内容】
2019-10-28  Tags: 数据库设计  点击:(49)  评论:(0)  加入收藏
单独的数据库:微服务设计的一个关键是数据库设计,基本原则是每个服务都有自己单独的数据库,而且只有微服务本身可以访问这个数据库。它是基于下面三个原因。 优化服务接口:微服...【详细内容】
2019-10-21  Tags: 数据库设计  点击:(112)  评论:(0)  加入收藏
1. 原始单据与实体之间的关系可以是一对一、一对多、多对多的关系。在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体。在特殊情况下,它们可能是一对多或...【详细内容】
2019-09-16  Tags: 数据库设计  点击:(149)  评论:(0)  加入收藏
▌简易百科推荐
1增1.1【插入单行】insert [into] <表名> (列名) values (列值)例:insert into Strdents (姓名,性别,出生日期) values (&#39;开心朋朋&#39;,&#39;男&#39;,&#39;1980/6/15&#3...【详细内容】
2021-12-27  快乐火车9d3    Tags:SQL   点击:(1)  评论:(0)  加入收藏
最近发现还有不少做开发的小伙伴,在写存储过程的时候,在参考已有的不同的写法时,往往很迷茫, 不知道各种写法孰优孰劣,该选用哪种写法,以及各种写法的优缺点,本文以一个简单的查询...【详细内容】
2021-12-23  linux上的码农    Tags:sql   点击:(9)  评论:(0)  加入收藏
《开源精选》是我们分享Github、Gitee等开源社区中优质项目的栏目,包括技术、学习、实用与各种有趣的内容。本期推荐的HasorDB 是一个全功能数据库访问工具,提供对象映射、丰...【详细内容】
2021-12-22  GitHub精选    Tags:HasorDB   点击:(5)  评论:(0)  加入收藏
作者丨Rafal Grzegorczyk译者丨陈骏策划丨孙淑娟【51CTO.com原创稿件】您是否还在手动对数据库执行各种脚本?您是否还在浪费时间去验证数据库脚本的正确性?您是否还需要将...【详细内容】
2021-12-22    51CTO  Tags:Liquibase   点击:(3)  评论:(0)  加入收藏
场景描述:由于生产环境的表比较复杂,字段很多。这里我们做下简化,只为说明今天要聊的问题。有两张表 tab1,tab2: tab1 数据如下: tab2 数据如下: 然后给你看下,我用来统计 name=&#3...【详细内容】
2021-12-20  Bald    Tags:SQL   点击:(5)  评论:(0)  加入收藏
前言知识无底,学海无涯,知识点虽然简单,但是比较多,所以将MySQL的基础写出来,方便自己以后查找,还有就是分享给大家。一、SQL简述1.SQL的概述Structure Query Language(结构化查...【详细内容】
2021-12-16  谣言止于独立思考    Tags:SQL基础   点击:(13)  评论:(0)  加入收藏
前言作为一名测试工程师,工作中在对测试结果进行数据比对的时候,或多或少要和数据库打交道的,要和数据库打交道,那么一些常用的 SQL 查询语法必须要掌握。最近有部分做测试小伙...【详细内容】
2021-12-14  柠檬班软件测试    Tags:SQL   点击:(15)  评论:(0)  加入收藏
话说C是面向内存的编程语言。数据要能存得进去,取得出来,且要考虑效率。不管是顺序存储还是链式存储,其寻址方式总是很重要。顺序存储是连续存储。同质结构的数组通过其索引表...【详细内容】
2021-12-08  小智雅汇    Tags:数据存储   点击:(17)  评论:(0)  加入收藏
概述DBConvert Studio 是一款强大的跨数据库迁移和同步软件,可在不同数据库格式之间转换数据库结构和数据。它将成熟、稳定、久经考验的 DBConvert 和 DBSync 核心与改进的现...【详细内容】
2021-11-17  雪竹聊运维    Tags:数据库   点击:(26)  评论:(0)  加入收藏
一、前言 大家好,我是小诚,《从0到1-全面深刻理解MySQL系列》已经来到第四章,这一章节的主要从一条SQL执行的开始,由浅入深的解析SQL语句由客户端到服务器的完整执行流程,最...【详细内容】
2021-11-09  woaker    Tags:SQL   点击:(35)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条