【Mysql】数据类型范式相关

1.Mysql范式与反范式

  • 我们所了解的,我们在设计数据库的时候会遵循数据库的三大范式,但是,有些时候反范式可以增加某些类型的查询,但同时可能是另外一个类型的查询变慢。比如添加技术表和汇总表是一种很好的优化查询的方式,但是这些表维护起来成本也很高。
  • 范式的优点:
    • 适用于写操作比较多的场景
    • 范式会使数据库很少或者没有重复数据
  • 范式的缺点:
    • 通常需要关联查询,而关联查询在某些场景下会使我们的索引失效。
  • 反范式的优点:
    • 反范式化的schema因为所有数据都在一张表中, 可以很好地避免关联。而我们知道关联表的查询效率是比较差的
    • 反范式的表能够更有效的使用索引策略,
  • 但是在真实的环境中,很少会极端的使用范式或者反范式,一般都是部分是遵循范式,部分是反范式的。
  • 数据库的三大范式:
    • 第一范式:数据库里面的每一列都是不能再分割的数据列,必须是不可拆分的最小单元,也就是确保每一列的原子。比如说,我有一个User表,字段:(id,age,name,cource)。id,age,name都是单独的数据,但是course里面存放了:数学,王老师。那么这个User表就违反了第一范式,因为这个course可分为两个列。
    • 第二范式:满足第一范式基础上,数据库中的每一行数据只能与其中的一列相关,如果数据库中出现重复数据,就需要吧表拆分开来。比如有一个用户订单表,字段有 (订单号,用户id,姓名,联系电话)如果一个人有多个订单,那么对于这张表,用户id,姓名,联系电话都是重复的。所以我们可以拆分成两张表,一个订单表,一个用户表通过用户id去关联。
    • 第三范式:在满足第二范式的基础上,每一列都是与主键直接相关,而不是间接相关。比如有abc三个列,主键是a, b可以依赖a,c可以依赖a。但是不能c依赖b,b依赖a,不能存在传递关系。

2.整数类型

  • 整数类型有:tinyint,smallint,mediumint,int,bigint。他们分别使用8,16,24,32,64位来存储。他们的存储范围从-2^(N-1) 到 2^(N-1) - 1 , 其中N是位数。
  • 整数类型有unsigned属性表示不能为负数,不为负数,那么整数这时候能够保存的范围能够提高一倍,就变成了0到2^N - 1。比如unsigned tinyint表示的范围是0到255,而tinyint表示的范围是-128到127。

3.实数类型

  • 实数类型是带了小数部分,mysql既支持精确类型,也支持不精确类型。
  • flout占32位,double占64位,double有更高的精度和更大的范围。但是他们两个在进行计算的时候都会损失精度。
  • 如果需要保证精度准确,我们在存储的时候可以使用decimal。因为decimal不会损失精度,比如财务场景下,但是如果数据量特别大,可以考虑用bigint去代替,比如说我们要精确到万分之一,我们可以把所有的金额进行扩大,这样我们可以避免浮点存储计算不精确和decimal精确计算代价太高的问题。

4.字符串类型

  • varchar和char都是用来存储字符串类型的

  • varchar类型用于存储可变长的字符串,更节省空间,因为它仅使用必要的空间。对性能也有帮助,

  • char是存储定长字符串的,例如,char类型可以用来存储密码的md5值,因为这个长度肯定是不变的。

  • 使用varchar(200) 和char(5) 存储 ‘hello’ 的空间开销是一样的。

  • blob和text类型都是为了存储更大的数据而设计的字符串数据类型,分别采用二进制和字符的方式去存储。与其他类型不同的是,Mysql吧bolb和text的值当作一个对象来处理,通常会特殊处理,如果数据量太大。一般用一个外部的存储区来进行存储,通过一个指针,指向外部存储区域实际的值。

5.日期和时间类型

  • Mysql存储的最小时间粒度是秒
  • 日期类型有datetime和timestamp
  • datetime保存的范围比较大,范围是1000-9999年,它是与时区无关的,使用8个字节去存储
  • timestamp保存的范围比较小,范围是1970-2038,它和时区有关,并且timestamp默认是not null,我们在初始化的时候必须要有值。占用4个字节的存储。
  • year类型,只显示年份,1000-9999
  • date类型,只显示年月日,不现实时分秒。1000-9999
使用搜索:谷歌必应百度