一、数据库基础知识

86 阅读5分钟

数据库基础知识

范式化设计

范式是数据库表设计的规范,是前辈们总结的经验,遵循范式化设计有助于我们创建出合理的数据库表

目前有六大范式,分别是第一范式、第二范式、第三范式、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。平时我们满足前三个范式就足够了,范式并非满足的越多越好。

第一范式

数据库表中的列都是不可再分割的基本数据项

image.png

上表中的age_sex列可以再被分割成age和sex两列,所以不满足第一范式

第二范式

数据库表中每一行都有唯一主键,并且非主键列依赖于主键

image.png

上表中商品编号和商品名称不依赖订单编号这个主键,可以单独成立一张表。并且表中出现了相同主键的记录,不满足第二范式

第三范式

数据库表中非主键列之间不能有依赖关系,只能与主键有直接依赖关系,不能是间接依赖

image.png

上表中商品名称依赖于商品编号,而不是订单编号,不满足第三范式

反范式设计

范式只是给出了设计数据库表的规范,不一定必须要满足

满足越多的范式,数据库表的冗余数据越少,但是查询效率也是越低

以下是范式和反范式设计的优缺点对比

image.png

无论是范式化还是反范式化设计,都是为了业务服务。在设计数据库表时,根据业务,适当的采用反范式化设计,可以让业务呈现更好的效果

数据库的数据类型

整数类型

整数类型包含以下几种:

  • tinyint:占据1个字节
  • smallint:占据2个字节
  • mediumint:占据3个字节
  • int:占据4个字节
  • integer:与int没有差别
  • bigint:占据8个字节

字段设计成整数类型时,可以选择无符号或者有符号。无符号代表都是正数,有符号代码既有正数又有负数。不过它们类型占用的字节数还是没有变化的。

采用整数类型存储时,有一种写法:int(5),int(8)。这种写法,int占用的字节数还是4个,但是数字显示长度会有不同。例如存入9,int(5)的显示是:00009,int(8)的显示是:00000009

实数类型

实数类型其实就是小数类型,存在一下几种:

  • float:占据4个字节
  • double:占据8个字节
  • decimal:有65个数字

decimal比较特殊,在数据库中是以字符串形式存储小数的,所以它的精度比float和double高。但是在计算时,cpu需要对其进行类型转换,效率就比float和double低了

其实如果业务上有很大的小数数据,并且计算时要求精度和效率,一般不用实数类型去存储,而是用bigint类型

例如银行业务,在存储钱时,要求存储到小数点后4位。那么存成bigint类型时,会将数据*10000后,变成整数再存入表中。

字符串类型

字符串类型有以下几种:

  • char:字符串是固定长度,可以指定
  • varchar:字符串是变化长度,可以指定最长的长度
  • blob:可以存储非常大的字符串
  • text:可以存储非常大的字符串
  • enum:枚举类型
  • set:字符串集合

char类型是固定长度的,varchar类型是变化长度的,所以在存储varchar类型的数据时,mysql中会有隐藏的列去存储数据的实际长度。所以在同长度的情况下,varchar比char更耗空间

blob和text类型可以存储非常大的字符串,所以一般会将这两列单独拿出来放到一张表中存储。这张表中可能只有两列,一个是主键,一个是blob或者text类型的列。这样方便优化。

enum是枚举类型,其存储的是整数,展现的数据是字符串。并且枚举值是以1开头,1,2,3...这样存储的

在插入枚举数据时,insert语句中可以写整数类型的枚举值,也可以写枚举值对应的字符串数据

时间类型

时间类型有以下几种:

  • datetime:存储的时间范围1001年-9999年
  • timestamp:存储的时间范围1970年-2038年

datetime和timestamp类型都是精确到秒,如果想更精确,可能需要转换成bigint去存储

数据库命名规范

数据库有以下命名规范:

  • 可读性原则:不要使用缩写去命名表名和字段名
  • 必须使用小写字母或者数字:因为linux操作系统是区分字母大小写的
  • 不使用复数名词
  • 禁用数据库自身的保留字
  • 索引命名

索引命名分非唯一索引和唯一索引

  • 非唯一索引命名:idx_字段名称
  • 唯一索引命名:uniq_字段名称