表结构设计

100 阅读3分钟

范式

数据库范式是设计关系型数据库时遵循的规范,目的是减少数据冗余,提高数据的一致性和完整性。常见的范式包括第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、BCNF等,还有更高级的第四范式和第五范式

第一范式

  • 描述:每个字段不可再分

  • 示例:有一张用户表(t_user),有用户名(name)和年龄(age)字段。用户名和年龄用一个字段(name_age)不符合第一范式,name和age拆开符合第一范式

    • 不符合第一范式 image.png
    • 符合第一范式 image.png

第二范式

  • 描述:第二范式前提要满足第一范式,第二范式表示字段要依赖于主键

  • 示例:表示用户所属组织

    • 不符合第二范式,组织id(org_id)不是属于用户表 image.png

    • 符合第二范式,组织id(org_id)放在中间关联表中
      image.png image.png

第三范式

  • 描述:第三范式前提要满足第二范式,表示非主属性之间不存在传递依赖关系

  • 示例:表示用户组织信息

    • 不符合第三范式,组织id(org_id)和组织名称(org_name)是非主属性存在依赖关系 image.png
    • 符合第三范式,拆分为两张表 image.png image.png

基本上符合三范式就会满足大多数业务场景,第四、五范式本文不进行介绍了。

反范式

有时候为了查询性能,在设计表机构的时候也会冗余字段,减小连表查询带来的更多的查询时间。

字段类型

dev.mysql.com/doc/refman/… mysql8的字段介绍官方文档地址

字符串类型VARCHAR和CHAR

VARCHAR

  • 定义:存储可变长度的字符类型,适合存储不确定长度的字符串

  • 语法:VARCHAR(n)

    • n表示字符长度,范围是0到65535
    • VARCHAR以1字节或2字节的长度前缀加上数据的形式存储。长度前缀表示值中的字节数。如果值不超过255字节,则列使用一个长度字节;如果值可能超过255字节,则使用两个长度字节。
    • 不同字符集单个字符的字节数也不同,如utf8mb4 字符集每个字符最多占4字节
    • 实际占用的空间为:字符数*字符单个字节数+长度前缀(1或2个字节)
  • 注意事项:VARCHAR列中的值是可变长度的字符串。其长度可以指定为从0到65,535的值。VARCHAR的有效最大长度受最大行大小(65,535字节,由所有列共享)和所使用的字符集的限制。

CHAR

  • 定义:适合存储固定长度的字符串

  • 语法:CHAR(n)

    • n表示字符数,CHAR 类型列的长度在创建表时声明的长度是固定的。长度可以是 0 到 255 之间的任何值

    • 存储 CHAR 值时,它们会用空格右填充到指定的长度。检索 CHAR 值时,末尾的空格会被删除,除非启用了 PAD_CHAR_TO_FULL_LENGTH SQL 模式。

  • CHAR和VARCHAR存储区别

image.png

文本类型TEXT和BLOB

TEXT

  • 定义:适合存储长文本
  • 子类型TINYTEXTTEXTMEDIUMTEXT, 和 LONGTEXT

BLOB

  • 定义:存储二进制数据
  • 子类型TINYBLOBBLOBMEDIUMBLOBLONGBLOB

数值类型

整数类型

  • 类型:TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT

  • 所需的存储和范围

image.png

浮点与定点数

  • 类型

    • FLOAT:单精度浮点
    • DOUBLE:双精度浮点
    • DECIMAL:精确到小数

日期时间类型

  • DATE​:日期,格式 YYYY-MM-DD
  • TIME​:时间,格式 HH:MM:SS
  • DATETIME​:日期时间,格式 YYYY-MM-DD HH:MM:SS(范围 1000-01-01 到 9999-12-31)。
  • TIMESTAMP​:时间戳(范围 1970-01-01 到 2038-01-19),自动转换为 UTC 存储。
  • YEAR​:年份(1 字节,范围 1901~2155)。

各类型存储要求

数值类型

image.png

时间类型

image.png

字符串类型

image.png