在学习关系型数据库的时候,常常听到主键外键的概念。他们都起到了什么作用?
他们和索引有什么关系?
说明:本文所探讨的概念基于MySQL 8.0 Innodb,其他版本或数据库可能略有差异。
为了方便阅读,每节的课代表部分做了总结,可以直接跳转。
基本知识
本节简单介绍下关系型数据库的特点,便于后续讲解。
关系型数据库中的数据以表的形式存储,每个表由行(Record)和列(Column)组成。
数据库表本质上是一个二维表,在列上定义字段,行上存储数据。
字段上可以定义数据类型,是否为空,是否唯一等规则。
表和表之间可以有关联关系,一对一、一对多的关系,也可以没有关联关系。
常见的MySQL、Oracle、SQL Server、PostgreSQL等都是关系型数据库。
主键
也叫PRIMARY KEY,从字面来看,主键就是主要的键,用来标识一行数据的唯一特征。
就像我们每个人都有一个身份证号,在全国范围内唯一。对于数据库中的数据也是一样,需要有一个字段来区别。
一般情况下,我们会用一个与业务无关的唯一值来做主键,并不是直接使用业务字段。
比如人员表中,不会直接用用户的身份证号来做主键,而是使用一个唯一不重复的值用来做主键。
在MySQL中,常用来做主键的是两种数据类型:数值型和字符串型。
数值型:自增数值。
字符串型:唯一随机字符串,比如UUID、MD5值。
两种数据类型有什么优劣?该如何选择?本文不是重点,后续会专门讲解,这里先给出结论:
一般而言,主键的数据类型一般选择数值类型,值要有序,根据数据规模选择自增值或者使用雪花算法生成的范围有序值。
此外,MySQL会根据主键值建立聚簇索引,提高数据的检索速度,由于索引结构的特点,更应该使用有序的数值作为主键值,关于索引的知识,可以参考我的一篇文章三言两语聊MySQL 索引。
联合主键
有时候,一个字段难以确定唯一性,这就需要用到联合主键了。即使用两个或者两个以上的字段做联合主键。
联合主键允许部分字段值重复,只要联合主键包含的全部字段值不重复即可。
联合主键带来了表关系的复杂度,实际很少使用。
课代表
主键是一种用来唯一标识表中每一条记录的字段或字段组合,主键的值必须唯一且非空。
主键会自动创建索引,起到加快数据检索的速度。
一般情况下,主键的数据类型为数值型,使用自增或者雪花算法生成范围递增值。
关于主键,你学会了吗?不定期更新数据库的相关知识,便于及时得到推送,欢迎关注!
外键
主键的作用搞明白了,外键是个什么鬼?外在的键?外来的键?
先卖个关子,首先来看个场景。
电商系统有订单,订单有明细,常见的表结构就是订单表和订单明细表,订单和订单明细是组合关系(组合关系是什么?后边会专门介绍数据之间的关系),它们之间怎么进行关联呢?
一般做法是在订单明细表中记录订单编号,比如在订单明细表添加一个订单编号的字段,并记录订单编号。
在定义表结构的时候,会把这个字段定义成外键(Foreign Key referencing Users table)。
聪明的小伙伴总是爱问为什么,不设置成外键行不行?
外键是用来建立表之间关联关系的约束,作用是保证数据的完整性和一致性。
外键定义了表之间的引用关系,确保一个表中的值在另一张表中一定存在。
回到前边的问题,如果不设置成外键,会有什么影响?
- 无法保证值在另一张表中一定存在
- 没办法做到级联操作,需要自己处理级联关系的数据
第一点会导致出现脏数据,比如在订单明细表中填写一个不存在的订单编码,第二点是在删除订单的时候级联删除订单明细,如果没有外键,需要自己手动删除。
为什么很多公司禁止使用外键呢?背后隐藏着什么血与泪呢?
在阿里编码规范中强制禁止使用外键,应该把外键的逻辑关系放到应用层中。
这是因为外键约束会降低数据库的性能,在对性能要求比较高的时候,相比较在应用层保证逻辑正确性的成本要低于使用外键。
课代表
外键(Foreign Key)是一种用来建立表与表之间关联关系的约束,用于保持数据完整性和一致性。
外键的作用有:
- 建立关联关系
- 保证数据的完整性和一致性
- 级联操作
本文主要讲了主键和外键的概念和作用,在工作中,对主键的接触可能比外键多,所以着重介绍了主键的类型选择。