范式
数据库范式是设计关系型数据库时遵循的规范,目的是减少数据冗余,提高数据的一致性和完整性。常见的范式包括第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、BCNF等,还有更高级的第四范式和第五范式
第一范式
-
描述:每个字段不可再分
-
示例:有一张用户表(t_user),有用户名(name)和年龄(age)字段。用户名和年龄用一个字段(name_age)不符合第一范式,name和age拆开符合第一范式
- 不符合第一范式
- 符合第一范式
- 不符合第一范式
第二范式
-
描述:第二范式前提要满足第一范式,第二范式表示字段要依赖于主键
-
示例:表示用户所属组织
-
不符合第二范式,组织id(org_id)不是属于用户表
-
符合第二范式,组织id(org_id)放在中间关联表中
-
第三范式
-
描述:第三范式前提要满足第二范式,表示非主属性之间不存在传递依赖关系
-
示例:表示用户组织信息
- 不符合第三范式,组织id(org_id)和组织名称(org_name)是非主属性存在依赖关系
- 符合第三范式,拆分为两张表
- 不符合第三范式,组织id(org_id)和组织名称(org_name)是非主属性存在依赖关系
基本上符合三范式就会满足大多数业务场景,第四、五范式本文不进行介绍了。
反范式
有时候为了查询性能,在设计表机构的时候也会冗余字段,减小连表查询带来的更多的查询时间。
字段类型
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存储区别
文本类型TEXT和BLOB
TEXT
- 定义:适合存储长文本
- 子类型:
TINYTEXT,TEXT,MEDIUMTEXT, 和LONGTEXT
BLOB
- 定义:存储二进制数据
- 子类型:
TINYBLOB,BLOB,MEDIUMBLOB,LONGBLOB
数值类型
整数类型
-
类型:TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT
-
所需的存储和范围
浮点与定点数
-
类型:
- 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)。