MySQL库表设计规范
表设计
1) 表必须定义主键,默认为ID,整型自增,如果不采用默认设计必须咨询DBA进行设计评估
2) ID字段作为自增主键,禁止在非事务内作为上下文作为条件进行数据传递
3) 禁止使用外键,触发器,存储过程
4) 多表中的相同列,必须保证列定义一致
5) 表默认使用InnoDB,国内表字符集默认使用gbk,国际默认使用utf8的表
6) 表必须包含gmt_create和gmt_modified字段,即表必须包含记录创建时间和修改时间的字段
7) 单表一到两年内数据量超过500w或数据容量超过10G考虑分表,且需要提前考虑历史数据迁移或应用自行删除历史数据
8) 单条记录大小禁止超过8k(列长度(中文)*2(gbk)/3(utf8)+列长度(英文)*1)
9) 日志类数据不建议存储在MySQL上,优先考虑Hbase或OB,如需要存储请找DBA评估使用压缩表存储
字段设计
1) 表被索引列必须定义为not null,并设置default值
2) 禁止使用float、double类型,建议使用decimal替代
3) 禁止使用blob、text类型保留大文本、文件、图片,建议使用其他方式存储(TFS/SFS),MySQL只保存指针信息
4) 禁止使用varchar类型作为主键语句设计
索引设计
1) 索引根据左前缀原则,当建立一个联合索引(a,b,c),则查询条件里面只有包含(a)或(a,b)或(a,b,c)的时候才能走索引,(a,c)作为条件的时候只能使用到a列索引,所以这个时候要确定a的返回列一定不能太多,不然语句设计就不合理,(b,c)则不能走索引
2) 索引不是越多越好,越多的索引带来的就是更高的索引维护成本,包含CPU计算消耗,索引建立时增加的IO开销等,因此一定要合理建立索引
3) 联合索引应该选择筛选性更优的列值放在最前面,比如单号、userid等,type,status等筛选性一般的不建议放在最前面
语句设计
1) 数据更新建议使用二级索引先查询出主键,再根据主键进行数据更新
2) 禁止使用非同类型的列进行等值查询!
其他
1) 禁止使用:存储过程、触发器、函数、视图、事件等MySQL高级功能
2) 禁止使用跨库查询
3) 禁止使用子查询,建议将子查询转换成关联查询
4) 禁止核心业务流程SQL包含:计算操作、多表关联、表遍历case when等复杂查询,建议拆分成单表简单查询
5) varchar长度设计需要根据业务实际需要进行长度控制,禁止预留过长空间。例如status使用varchar(128)进行存储。原因是varchar类型虽然对于存储是根据实际长度进行存储,但内存分配则是根据指定长度进行分配,因此不合理的长度设计会导致内存的不合理占用
Oracle库表设计规范
表的命名
规范1: 表的命名总长度不能超过26位!
规范2: 表名由英文单词与下划线组成,命名方式:系统名_表功能名单词之间用下划线隔开,严禁使用中文拼音。
对于单词超长的,可使用单词缩写,但是单词缩写必须能够完整表达原单词的含义。
如:TRADE_BASE表,系统名为trade,而此表的含义是trade系统的基本信息表。
规范3: 临时表命名方式:TMP_表缩写_日期
字段的命名
规范1: 字段名必须非ORACLE关键字
规范2: 字段名长度不得超过15位
规范3: 字段的命名需要有含义 字段命名要能真实表达字段的意义。
对于外键引用的字段,需要与主表的字段名保持一致。(备用字段命名:VAR1、VAR2等等)
规范4: 分库分表的字段名,字段类型和字段顺序要相同
约束的命名
规范1: 约束名的最大长度为26位
规范2: 主键约束:表名_PK
规范3: 唯一性约束:表名_U
对于存在多个唯一性约束的表,唯一性约束的命名为:表名缩写_字段名_U
规范4: 检查约束:表名_C 对于存在多个检查约束的表,检查约束的命名为:表名缩写_字段名_C
表的创建规范
规范1: 表的设计须遵循第一范式,
尽量达到第二范式及第三范式(从实际情况出发,取平衡点。当有设计不遵循第一范式的情况,请及时与接口的开发DBA进行沟通)
即不允许字段出现二义性;
例如,表中有这样的字段,字段的值是由数位数字组成的代码,第一位表示客户类型,第二位表示渠道类型……,这种设计不符合第一范式。
1NF:关系模式R中的每一个具体关系r中,每个属性值都是不可再分的最小数据单位
2NF:关系模式R中的所有非主属性都完全依赖于任意一个候选关键字
3NF:关系模式R中的所有非主属性对任何候选关键字都不存在传递依赖
规范2: 表主键不可使用联合主键(分区表除外,可加上分区键作为主键),分库分表的表必须有全局的主键
规范3: create table语句参数不能包含storage选项,不能包含nologging选项
因为DBA已经在表空间设置存储参数,不需要在表一级设置存储参数。
create table TRADE_BASE
(
TRADE_NO VARCHAR2(64),
GMT_MODIFIED TIMESTAMP,
GMT_CREATE TIMESTAMP
)tablespace ZHIFB_DATA
规范4: 每个表的字段数目不要超过100个,同时,表中一条记录所有字段的长度不能超过数据库的db_block_size大小(LOB类型的字段除外)
如果超过,可以创建多个小表的方式处理;如有特殊情况确实需要创建多字段的宽表,则按实际情况与数据库设计审核方讨论后决定。
目前的线上数据库中,DB_BLOCK_SIZE一般为8K,如果有不清楚的地方,可咨询接口的开发DBA。
规范5: 字段必须定义合适的数据类型。
在设计表结构时,只存储数字的字段定义成数字类型,只存储字符的字段定义成字符类型,只存储日期的字段定义成日期类型,以减少使用过程中的数据类型转换。
禁止使用long数据类型,因为long类型已淘汰,且oracle已经不再对LONG类型做后续开发。
若字段有记录大数据的情况,建议将数据保存到文件,然后字段里记录文件的路径。
规范6: 表和字段必须有comment中文注释。表和字段必须有中文注释,注释采用comment on的形式,如:
Comment on table TRADE_BASE is ‘交易基本信息表,预估日增长量5000万’;
Comment on column TRADE_BASE.TRADE_NO is ‘交易号’;
规范7: 根据更新的频繁程度决定字段的顺序。
为提高数据库效率,建议将更新频繁程度高的字段排在表中靠前的位置。
越靠后的字段效率越低:比如4AAAA6BBBBBB2CC,当要扫描到2CC时,数据库并不知道C的位置,
如果头占了10个长度,那么C的位移就是 10+(4+1)+(6+1)+1.每个字段没有直接的位移地址的,
既然没有23的位移,ORACLE只有通过前面的头,以及A B的位置来推算位移。
那么越往后面的字段,推算位移次数越多,CPU计算的次数也越多。
规范8: 除临时表以外,其他表必须有GMT_CREATE与GMT_MODIFIED字段在添加数据时,需要将GMT_CREATE与GMT_MODIFIED字段写入为SYSDATE;
在更新数据时,需要将GMT_MODIFIED字段修改为SYSDATE;GMT_CREATE与GMT_MODIFED字段类型一致,为TIMESTAMP
规范9: 创建表时,添加必要的约束。
添加主键约束:ALTER TABLE TRADE_BASE ADD CONSTRAINT TRADE_BASE_PK PRIMARY KEY(TRADE_NO) USING INDEX TABLESPACE ZHIFB_INDX;
添加唯一性约束:ALTER TABLE TRADE_BASE ADD CONSTRAINT TRADE_BASE_U UNIQUE(BUYER_ACCOUNT) USING INDEX TABLESPACE ZHIFB_INDX;
规范10:不在表中添加外键关联。为了提高数据库处理效率,不在表中添加外键的关联关系。该关系由应用来保证。
规范11:不添加带默认值的字段。可使用IBATIS的默认值,而不使用表字段默认值
规范12:对于长度为1的字段,建议使用VARCHAR2(1)。
如:状态字段,
alter table trade_base add (trade_status varchar2(1));
comment on column trade_base.trade_status is ‘交易状态:0,表示交易失败;1,表示交易成功’;
Sequence命名格式1
sequence的命名格式为:”seq_”+表名
在一个表仅使用一个SEQUENCE的情况下,使用此命名方式
Sequence命名格式2
“seq_”+表名+”_”+字段名。
特殊情况:如果同一个表上有多个字段使用SEQUENCE,则后创建的SEQUENCE使用此方式命名
例如:seq_trade_base_00_id,其中trade_base_00为表名,id为与sequence关联的字段名;如果命名的长度超过了oracle的规定(oracle规定30个字符),则表名与字段名都采用缩写的方式。
创建sequence的格式规范
建议1: create sequence 建议放在一行里,其它的minvalue、maxvalue、start with、increment by、cache、cycle、noorder选项建议各自单独一行,如下所示:
create sequence tradecore00.seq_trade_base_00
minvalue 1
maxvalue 999999
start with 1
increment by 1
cache 200
cycle
noorder;
其中:
(1) minvalue用于指定sequence的最小值。
(2) maxvalue用于指定sequence的最大值。
(3) start with用于指定sequence产生的第一个值。
(4) increment by用于指定步长。
(5) cache 用于让sequence预生成一些序列号cache在内存中。
(6) cycle 用于指定sequence到达最大值时从最小值又开始循环。
(7) noorder 用于指定sequence产生唯一的但不一定连续的序列号。
创建sequence应遵循的设计要求
规范1: 建议sequence都指定为循环模式(cycle)。
对使用循环的sequence,必须要考虑使用sequence值的字段是否作为主键或者其上是否有唯一性约束,
如果是,则需要采取措施防止字段值出现重复的情况(如:主键规则为YYYYMMDD+SEQUENCE)。
因特殊原因必须使用非循环模式(nocycle)的sequence,在指定其最大值时,必须要结合业务的量进行考虑,
必须要保证业务量不会超过sequence的最大值,
同时开发人员需要提供为什么要使用非循环(nocycle)模式及业务量是否会超过sequence的最大值的说明,由开发dba审核。
规范2: 要求所有的sequence都使用cache选项。
采用缓存(cache)技术,是为了减少对产生sequence值的等待。
CACHE SIZE的设置规则:MAX(200,可支撑5分钟业务调用的SEQUENCE量)。
在exclusive模式数据库中(单节点数据库)所有sequence的cache值最低为200;
可支撑5分钟业务调用的SEQUENCE量计算方法:如,目前交易高峰值500笔/秒,
那么需要的SEQUENCE CACHE量=500*5*60=150000,而交易库TRADE_BASE表有100个SEQUENCE,
因此TRADE_BASE各个SEQUENCE的CACHE量=150000/100=1500.
规范3: sequence的最大值不能超过字段宽度。
超过字段长度,得到的sequence值无法插入。
需要注意的是:部分使用SEUQNECE的字段,其值并不完全由SEQUENCE组成。
例如:ID字段长度是15,而ID是由8位日期+SEQUENCE组成,那么SEQUENCE的最大长度应该是9999999
规范4: 创建sequence时,必须指定minvalue、maxvalue、start with、increment by、cache的值
maxvalue的值要求设为全为9的数字,例如:maxvalue 999999 而不要设成maxvalue 911111。
规范5: 创建sequence的用户与使用此sequence的表的属主相同。
例如: trade_base_00表ID字段所使用的序列,其属主就是trade_base_00表的属主tradecore00,即表的属主和sequence的属主为同一个用户。
规范6: 建议使用noorder选项,如果业务对产生序列号的顺序有要求就用order。
在rac模式数据库中,使用noorder会减少节点之间数据交换,从而提高性能。
复杂语句设计规范
分页查询
每次查询返回条数控制在200条以内,当预计到查询的数据肯定会大量超过200时,需要进行分页查询。当条数较多是,请采用高效页面语句:
select col1,col2,col3,col4 from table_name where id>(select id from table_name limit N,1) limit 200
其中N表示当前最小的分页码。例如分成3批,语句为:
select col1,col2,col3,col4 from table_name where id>=(select id from table_name limit 1,1) limit 200;
select col1,col2,col3,col4 from table_name where id>=(select id from table_name limit 201,1) limit 200;
select col1,col2,col3,col4 from table_name where id>=(select id from table_name limit 401,1) limit 200;
这个方法只适用于全表数据分页,下面这种情况不建议使用:
select xxx,xxx,xxx from tb_name where type='S' and id>(select id from tb_name where type='S' limit 401,1) limit 200;
因为在这种情况下MySQL有可能会使用id作为索引,反而导致了全表查询.
Oracle->MySQL字段转换规则:
Oracle |
MySQL |
number(2) |
tinyint |
number(4) |
smallint |
number(6) |
mediumint |
number(9) |
int |
number |
bigint |
char[最大2000字节] |
char |
varchar2[最大4000字节] |
varchar[最大65532字节] |
date |
datetime |
问题回复
1.为什么自增主键ID不能作为上下文?
因为MySQL的主备在极端情况下有可能存在数据丢失的情况,那设想一种极端情况,主库宕机,备库没有接收到数据,那这个时候对于App来说,已经收到了主库给返回的自增ID例如是1004,在DBA做完主备切换以后,新主库原来可能只到了1003,这个时候业务再进行数据插入,那又返回了一个1004,这个时候就会有数据冲突,而且很有可能上游的1004对应的并不是这个时候的1004,造成数据错乱。因此强烈不建议业务在非事务里面使用自增主键做查询条件,或者作为上下文进行传输
2.为什么不允许使用外键
从三个方面考虑:
1)DB维护成本。增加了外键约束,在数据维护上会增加开销,不易维护
2)DB性能影响。线上DB尽可能做到的是轻量,这样可以提供更高效的DB容量,而更多的DB功能带来的就是更多的额外开销
3)升级风险。类似存储过程等功能在DB升级时可能会由于版本问题带来一些不一样的实现方式,因此使用额外功能需要谨慎
相关推荐
### MySQL数据库设计规范详解 #### 一、概述 在当今数据驱动的世界中,数据库的设计与管理至关重要。良好的数据库设计不仅能提升系统的稳定性和可扩展性,还能优化查询性能,确保数据安全。MySQL作为一种广泛使用...
为了确保数据库设计的一致性、标准化和可维护性,公司制定了一份名为“数据库设计规范”的文档,旨在为软件开发过程中的数据库设计提供明确的命名规范和编程规范,便于团队沟通与维护。 数据库设计规范的目的在于...
数据库设计规范是数据库建设的基础性文件,旨在规范数据库的设计过程,提高数据库的性能、可维护性和安全性。规范详细规定了数据库设计的总体要求、对象命名规则、程序编码要求,以及在设计过程中应避免的问题等。 ...
在这样的背景下,制定一套全面且实用的数据库设计规范显得尤为重要。本文档《数据库设计规范-编码规范.docx》正是为了解决这一需求而诞生。 文档的“目的”章节明确指出,规范的设立旨在统一公司软件开发过程中的...
"数据库设计规范word文档" 数据库设计规范是指在设计数据库时,遵守的一些规则和标准,以确保数据库的结构合理、数据一致、易于维护和扩展。本文档将总结数据库设计规范的主要内容,包括数据库编码规范、字段设计...
《8数据库设计规范》文档是针对Oracle数据库设计的一份详细指南,旨在确保系统设计的统一、稳定和优化。本文档的编写目的是为了提供一套标准,让开发者在利用Oracle数据库进行系统设计时,能够遵循一致的规则,从而...
数据库设计规范是构建高效、稳定、易于理解和维护的数据库系统的关键。本文档旨在提供一套详细的指导原则,确保数据库设计的合理性和数据访问的高效性,同时也促进数据共享和编码标准化。 **第1章 目的** 数据库...
数据库设计规范是构建高效、稳定、可扩展的数据库系统的基础,它涵盖了多个方面,包括数据库策略、命名规范以及数据管理等多个关键环节。本规范旨在提供一套标准,以确保数据库的高效运行,降低维护成本,同时增强...
《数据库设计规范——Oracle版本》 1、目的 本文档旨在定义一套详细的Oracle数据库设计规范,为数据库的设计、规划、开发以及后期维护提供技术指导。它涵盖了从物理设计到逻辑设计,再到SQL编写等多个关键环节,...
保密级别: 绝密 机密 秘密 内部公开 数据库设计规范 变更记录 "版本号 "修改点说明 "变更日期 "变更人 "审批人 " "V1.0 "创建 " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " ...
这份“数据库设计规范(通用版)”的压缩包提供了一套通用的指导原则和最佳实践,帮助开发者遵循良好的设计标准,确保数据库高效、可靠且易于扩展。 首先,数据库设计的核心在于需求分析。在设计之初,需要全面理解...
数据库设计规范对于任何大型系统来说都是至关重要的,它确保了数据的一致性、完整性和可维护性。本文档主要关注数据库设计中的命名规范,旨在规范化数据库的构建过程,提高开发效率,并降低后期维护的难度。 首先,...
《XXX数据库设计规范模板》是一份详尽的指导文档,旨在规范数据库的设计、开发和管理,确保系统的稳定性、可扩展性和安全性。以下是该规范的主要内容: 1. **范围**:这份标准适用于XXX,旨在规定数据库设计和编程...
"MongoDB 数据库设计规范" MongoDB 数据库设计规范是 MongoDB 数据库的设计和实现的重要指南。该规范旨在提供一个全面的 MongoDB 数据库设计指南,涵盖了 MongoDB 的核心优势、BSON 的优化、架构设计、适用场景、...
SQLServer数据库设计规范
数据库设计规范是软件开发中的重要环节,它确保了数据库的高效、稳定和可维护性。以下是对标题和描述中提到的数据库设计规范的详细说明: 1. **字段命名规范**: - 表示是否的概念字段应以 `is_` 开头,数据类型为...
Oracle数据库设计规范旨在确保数据库设计的质量,预防潜在问题,并培养良好的编程习惯,从而提升软件的可靠性。规范涵盖了命名规范、设计原则等多个方面,适用于所有应用开发人员和参与数据库应用开发的软件人员。 ...