数据库基础知识
范式化设计
范式是数据库表设计的规范,是前辈们总结的经验,遵循范式化设计有助于我们创建出合理的数据库表
目前有六大范式,分别是第一范式、第二范式、第三范式、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。平时我们满足前三个范式就足够了,范式并非满足的越多越好。
第一范式
数据库表中的列都是不可再分割的基本数据项
上表中的age_sex列可以再被分割成age和sex两列,所以不满足第一范式
第二范式
数据库表中每一行都有唯一主键,并且非主键列依赖于主键
上表中商品编号和商品名称不依赖订单编号这个主键,可以单独成立一张表。并且表中出现了相同主键的记录,不满足第二范式
第三范式
数据库表中非主键列之间不能有依赖关系,只能与主键有直接依赖关系,不能是间接依赖
上表中商品名称依赖于商品编号,而不是订单编号,不满足第三范式
反范式设计
范式只是给出了设计数据库表的规范,不一定必须要满足
满足越多的范式,数据库表的冗余数据越少,但是查询效率也是越低
以下是范式和反范式设计的优缺点对比
无论是范式化还是反范式化设计,都是为了业务服务。在设计数据库表时,根据业务,适当的采用反范式化设计,可以让业务呈现更好的效果
数据库的数据类型
整数类型
整数类型包含以下几种:
- 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_字段名称