MySql表设计及相关规范

一、数据库设计思维

   1.  添加必要的(冗余)字段
       像“创建时间”、“修改时间”、“备注”、“操作用户IP”和一些用于其他需求(如统计)的字段等,在每张表中必须都要有,不是 说只有系统中用到的数据才会存到数据库中,一些冗余字段是为了便于日后维护、分析、拓展而添加的,这点是非常重要的,比如黑客攻击,篡改了数据,我们便就可以根据修改时间和操作用户IP来查找定位。
每个字段要有注释,每个表名要有注释,字段的取值含义或者范围,枚举值要有注释,这些都要有中文注释
   2. 设计合理的表关联
       若多张表之间的关系复杂,建议采用第三张映射表来关联维护两张表之间的关系,以降低表之间的直接耦合度。若多张表涉及到大数据量的问题,表结构尽量简单,关联也要尽可能避免。

二、命名规范

   1.表名:同一个应用(或领域)下的,要有相同的前缀,如:t_xxx
   2. 库名、表名、字段名:要字母小写加下划线风格,长度不能超过32个字符,禁止拼音加英文混合命名
   3. 索引命名规范:普通索引 idx_+字段名,主键索引 pk_+字段名,唯一索引 uk_+字段名,
   4. 简洁、见名知意,

三、字段数据类型设计规范

在数据库色设计过程中,我们要本着够用的原则,不能把数据字段范围设为最大或者默认值,会导致存储空间大量的浪费,对数据库的执行效率造成很大的影响。

用尽量少的存储空间来存数一个字段的数据:

        例如:能使用int就不要使用varchar、char,能用varchar(16)就不要使用varchar(256);

        IP地址最好使用int类型;

        固定长度的类型最好使用char,例如:邮编;

        能使用tinyint就不要使用smallint,int;

        最好给每个字段一个默认值,最好不能为null;

 

  1. 字段类型尽可能占用少的存储空间

       更小的数据类型通常更快,因为他们占用更少的磁盘、内存和CPU缓存,并且处理CPU的时间也很短。在需要存储年龄、性别这些类似的应用场景中,应该选择tinyint来存储,而不是int。处理日期的时候,存储用户日期,应该选择date类型而不是datetime,datetimek可以精确到时分秒。

        TIMESTAMP和DATETIME除了存储范围和存储方式不一样,没有太大区别。当然,对于跨时区的业务,TIMESTAMP更为合适。

      2.数据类型的整合最好固定长度

      存储字符时,应优先考虑char数据类型,因为char是定长的,而varchar 是变长的,mysql处理char比varchar要快一点。char类型的最大宽度为255 字节,varchar 最大宽度为 65535 个字节。

    3.尽量避免NULL

      索引null列需要额外的空间来保存,占更多空间,进行比较和计算时,对null值作特别的处理,可能造成索引失效。

    4.数据库设计过程中尽量使用int字段类型

     所有的数据类型中int不管是存储空间还是执行速度方面都是比较好的。但但是不要因为int高效,而把所有的字段都设计成为int来处理。

    5.财务相关数据,使用decimal类型

      用decimal来存储金额字段,不要用float和double,会出现数据精度丢失。

四、Mysql开发规范

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

    2.sql语句尽可能简单(一条sql只能在一个cpu运算,大语句拆小语句,减少锁时间,一条大sql可以堵死整个库);

    3.所有sql关键词全部大写,比如SELECT,UPDATE,FROM,ORDER,BY等,所有的表名和库名都要用``包含

         如SELECT COUNT(*) FROM `cdb_members` WHERE `userName` = 'aeolus';

    4.避免在数据库中进行数学运算

       MySQL不擅长数学运算和逻辑判断无法使用索引

    5.使用in代替or,in的值不超过1000个

    6.INSERT语句必须显式的指明字段名称,不使用INSERT INTO table()

    7.禁止使用子查询,建议将子查询转换成关联查询

Msql好奇的问题点:

  1. int(5)和int(10)的区别是什么?

        int(x) x的值不管是什么,存储数字的取值范围还是int本身数据类型的取值范围,x只是数据显示的长度而已,bigint和tinyinit类型也类似。

     2.char(10)和varchare(10)的区别是什么?

       定义一个char[10]和varchar[10],如果存进去的是‘abcd’,那么char所占的长度依然为10,除了字符‘abcd’外,后面跟六个空格,而varchar就立马把长度变为4了,取数据的时候,char类型的要用trim()去掉多余的空格,而varchar是不需要的。char的存取数度还是要比varchar要快得多,因为其长度固定,方便程序的存储与查找;但是char也为此付出的是空间的代价,因为其长度固定,所以难免会有多余的空格占位符占据空间,可谓是以空间换取时间效率,而varchar是以空间效率为首位的。与int不同的是,若存存储的内容超过定义的长度,就会出错。

Mysql索引:

索引类似于书本中的目录

索引由数据库中一列或多列组合而成,其作用是提高对表中数据的查询速度
索引的优点是可以提高检索数据的速度
索引的缺点是创建和维护索引需要耗费时间
索引可以提高查询速度,会减慢写入速度

  • 普通索引:仅加速查询
  • 唯一索引:加速查询 + 列值唯一(可以有null)
  • 主键索引:加速查询 + 列值唯一 + 表中只有一个(不可以有null),主键创建时就会自动创建主键索引
  • 组合索引:多列值组成一个索引
    专门用于组合搜索,其效率大于索引合并
  • 全文索引:对文本的内容进行分词,进行搜索(将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。)

猜你喜欢

转载自blog.csdn.net/weixin_37934748/article/details/84108887