数据库设计--坑(0)

要点:

  • CHAR、VARCHAR、INT 数据类型

  • 主键外键设计原则

  • 冷热数据分离概念

  • 长度过大字段的设计

编码问题

  • 字符和字节的区别:1 个字符可以代表一个英文字母/汉字/数字,而 1 个汉字按照编码的不同可以是 2-3 个字节的(大部分英文字母和数字都是 1 个字节)。

  • UTF-8 是 Unicode 的实现方式之一,Unicode 只是一个字符集。

  • UTF-8 编码存储问题

MySQL 数据类型

  • CHAR(size):

    存储最大 字符 长度为 size 的字符串值(size 取值范围是 0-255),字段占用的 字符 数固定。

    这里固定的意思是如果存储的字符串长度小于 size,那 CHAR 会自动用空格补全存入数据库中 (这里的空格不显示)。

  • VARCHAR(size):

    存储最大 字符 长度为 size 的字符串值(size 取值范围是 0-65535),字段占用的 字符 数根据实际值变化。

    即如果存储的字符串长度小于 size,VARCHAR 并 不会像 CHAR 那样自动用空格补全字符串。

  • INT(size):

    存储整数值,容易混淆的是 size 所代表的含义,这里的 size 是 指整数显示的宽度,而不是指整数可以存储的最大位数,实际上 INT(10) 和 INT(20) 能存储的数字范围是一样的。

    如果设置了一个字段为 INT(5),该字段依然能够存入一个 6 位数的值,且取出的时候也不会将其截断为 5 位;如果存入一个 3 位数的值并且 将字段设置为 ZeroFill ,那么显示该 3 位数值的时候会自动在数字前面补 0。

设计指导方针

  • CHAR 和 VARCHAR 的选择:

    因为 CHAR 无论存储数据长度本身长度多少,都会占用固定的长度,因此存储空间占用会有一定的浪费,而 VARCHAR 由于是可变长度,这个问题就可以得到解决,但在性能上会受到一定的影响, 对于长度基本变化不大,且要求查询速度的应用来讲,CHAR 会更加合适,而 VARCHAR 更节约存储空间。

  • 数据库提取最关键的信息,无关信息(即不需要我方处理的信息)可以直接存到一个 VARCHAR 或者 TEXT 中。需要注意的是为了避免 TEXT 或者过大的 VARCHAR 字段对表的查询性能造成影响,可以把 TEXT 字段重新组织成一张表,原表中只需要存储对应的 id 值即可。

  • 数据冷热分离:

    冷数据就是指查询频次较低的数据,热数据就是指查询频次较高的数据。

    如果把冷热数据放在同一张表中,那么会导致单表数据量过大,严重影响查询性能,这个时候将冷数据备份到另一张表中可以保证原表的查询性能。

  • 主键外键的设计原则:

    1. 主键应该是一个无意义的自增 id,然后将业务上的“主键”设置为唯一索引。如果业务上(逻辑上)的“主键”是由多个字段组成的,那么可以建立 联合索引

    2. 不能使用外键和级联,所有的相关操作需要在应用层解决。

    3. 主键外键设计相关的博文

  • 字段能使用整型的地方就不用字符型。

  • 大型文件(图片)一般都存储在一个独立的文件服务器中,不存在数据库中也不存在服务器本地的文件系统中,比如 CDN。