专栏名称: 数据分析与开发
伯乐在线旗下账号,分享数据库相关技术文章、教程和工具,另外还包括数据库相关的工作。偶尔也谈谈程序员人生 :)
目录
相关文章推荐
51好读  ›  专栏  ›  数据分析与开发

数据库表设计的18条军规

数据分析与开发  · 公众号  · 数据库  · 2024-05-06 09:29

正文

请到「今天看啥」查看全文



唯一索引,可以加 ux_ 前缀,比如:ux_product_code。


2.字段类型


在设计表时,我们在选择字段类型时,可发挥空间很大。

时间格式的数据有:date、datetime 和 timestamp 等等可以选择。

字符类型的数据有:varchar、char、text 等可以选择。

数字类型的数据有:int、bigint、smallint、tinyint 等可以选择。

说实话,选择很多,有时候是一件好事,也可能是一件坏事。

如何选择一个合适的字段类型,变成了我们不得不面对的问题。

如果字段类型选大了,比如:原本只有 1-10 之间的 10 个数字,结果选了 bigint,它占 8 个字节。

其实,1-10 之间的 10 个数字,每个数字1个字节就能保存,选择 tinyint 更为合适。

这样会白白浪费 7 个字节的空间。

如果字段类型择小了,比如:一个 18 位的 id 字段,选择了 int 类型,最终数据会保存失败。

所以选择一个合适的字段类型,还是非常重要的一件事情。


以下原则可以参考一下:


  1. 尽可能选择占用存储空间小的字段类型,在满足正常业务需求的情况下,从小到大,往上选。
  2. 如果字符串长度固定,或者差别不大,可以选择char类型。如果字符串长度差别较大,可以选择 varchar 类型。
  3. 是否字段,可以选择 bit 类型。
  4. 枚举字段,可以选择 tinyint 类型。
  5. 主键字段,可以选择 bigint 类型。
  6. 金额字段,可以选择 decimal 类型。
  7. 时间字段,可以选择 timestamp 或 datetime 类型。


3.字段长度


前面我们已经定义好了字段名称,选择了合适的字段类型,接下来,需要重点关注的是字段长度了。


比如:varchar(20),biginit(20) 等。


那么问题来了,varchar 代表的是字节长度,还是字符长度呢?


答:在 M ySQL 中除了 varchar 和 char 是代表字符长度之外,其余的类型都是代表字节长度。


biginit(n)  这个 n 表示什么意思呢?


假如我们定义的字段类型和长度是:bigint(4),bigint 实际长度是 8 个字节。


现在有个数据 a=1,a 显示 4 个字节,所以在不满 4 个字节时前面填充 0(前提是该字段设置了 zerofill 属性),比如:0001。


当满了 4 个字节时,比如现在数据是 a=123456,它会按照实际的长度显示,比如:123456。


但需要注意的是,有些 M ySQL 客户端即使满了 4 个字节,也可能只显示 4 个字节的内容,比如会显示成:1234。

所以 bigint(4),这里的4表示显示的长度为 4 个字节,实际长度还是占 8 个字节。


4.字段个数


我们在建表的时候,一定要对字段个数做一些限制。

我之前见过有人创建的表,有几十个,甚至上百个字段,表中保存的数据非常大,查询效率很低。

如果真有这种情况,可以将一张大表拆成多张小表,这几张表的主键相同。

建议每表的字段个数,不要超过 20 个。

5. 主键


在创建表时,一定要创建主键。

因为主键自带了主键索引,相比于其他索引,主键索引的查询效率最高,因为它不需要回表。

此外,主键还是天然的唯一索引,可以根据它来判重。

在单个数据库中,主键可以通过 AUTO_INCREMENT,设置成自动增长的。

但在分布式数据库中,特别是做了分库分表的业务库中,主键最好由外部算法(比如:雪花算法)生成,它能够保证生成的id是全局唯一的。

除此之外,主键建议保存跟业务无关的值,减少业务耦合性,方便今后的扩展。

不过我也见过,有些一对一的表关系,比如:用户表和用户扩展表,在保存数据时是一对一的关系。

这样,用户扩展表的主键,可以直接保存用户表的主键。


6.存储引擎


M ySQL 8 以前的版本,默认的存储引擎是 myisam,而 M ySQL 8 以后的版本,默认的存储引擎变成了 innodb。

之前我们还在创建表时,还一直纠结要选哪种存储引擎?

myisam 的索引和数据分开存储,而有利于查询,但它不支持事务和外键等功能。

而 innodb 虽说查询性能,稍微弱一点,但它支持事务和外键等,功能更强大一些。

以前的建议是:读多写少的表,用 myisam 存储引擎。而写多读多的表,用 innodb。

但虽说 M ySQL 对 innodb 存储引擎性能的不断优化,现在 myisam 和 innodb 查询性能相差已经越来越小。

所以,建议我们在使用 M ySQL 8 以后的版本时,直接使用默认的 innodb 存储引擎即可,无需额外修改存储引擎。

7. NOT NULL


在创建字段时,需要选择该字段是否允许为 NULL。






请到「今天看啥」查看全文