专业编程教程与实战项目分享平台

网站首页 > 技术文章 正文

主键外键“键键不止”,他们都是干什么的?

ins518 2024-10-26 12:10:59 技术文章 13 ℃ 0 评论

在学习关系型数据库的时候,常常听到主键外键的概念。他们都起到了什么作用?

他们和索引有什么关系?

说明:本文所探讨的概念基于MySQL 8.0 Innodb,其他版本或数据库可能略有差异。

为了方便阅读,每节的课代表部分做了总结,可以直接跳转。

基本知识

本节简单介绍下关系型数据库的特点,便于后续讲解。

关系型数据库中的数据以表的形式存储,每个表由行(Record)和列(Column)组成。

数据库表本质上是一个二维表,在列上定义字段,行上存储数据。

字段上可以定义数据类型,是否为空,是否唯一等规则。

表和表之间可以有关联关系,一对一、一对多的关系,也可以没有关联关系。

常见的MySQL、Oracle、SQL Server、PostgreSQL等都是关系型数据库。

主键

也叫PRIMARY KEY,从字面来看,主键就是主要的键,用来标识一行数据的唯一特征。

就像我们每个人都有一个身份证号,在全国范围内唯一。对于数据库中的数据也是一样,需要有一个字段来区别。

一般情况下,我们会用一个与业务无关的唯一值来做主键,并不是直接使用业务字段。

比如人员表中,不会直接用用户的身份证号来做主键,而是使用一个唯一不重复的值用来做主键。

在MySQL中,常用来做主键的是两种数据类型:数值型和字符串型。

数值型:自增数值。

字符串型:唯一随机字符串,比如UUID、MD5值。

两种数据类型有什么优劣?该如何选择?本文不是重点,后续会专门讲解,这里先给出结论:

一般而言,主键的数据类型一般选择数值类型,值要有序,根据数据规模选择自增值或者使用雪花算法生成的范围有序值。

此外,MySQL会根据主键值建立聚簇索引,提高数据的检索速度,由于索引结构的特点,更应该使用有序的数值作为主键值,关于索引的知识,可以参考我的一篇文章三言两语聊MySQL 索引

联合主键

有时候,一个字段难以确定唯一性,这就需要用到联合主键了。即使用两个或者两个以上的字段做联合主键。

联合主键允许部分字段值重复,只要联合主键包含的全部字段值不重复即可。

联合主键带来了表关系的复杂度,实际很少使用。

课代表

主键是一种用来唯一标识表中每一条记录的字段或字段组合,主键的值必须唯一且非空。

主键会自动创建索引,起到加快数据检索的速度。

一般情况下,主键的数据类型为数值型,使用自增或者雪花算法生成范围递增值。

关于主键,你学会了吗?不定期更新数据库的相关知识,便于及时得到推送,欢迎关注!

外键

主键的作用搞明白了,外键是个什么鬼?外在的键?外来的键?

先卖个关子,首先来看个场景。

电商系统有订单,订单有明细,常见的表结构就是订单表和订单明细表,订单和订单明细是组合关系(组合关系是什么?后边会专门介绍数据之间的关系),它们之间怎么进行关联呢?

一般做法是在订单明细表中记录订单编号,比如在订单明细表添加一个订单编号的字段,并记录订单编号。

在定义表结构的时候,会把这个字段定义成外键(Foreign Key referencing Users table)。

聪明的小伙伴总是爱问为什么,不设置成外键行不行?

外键是用来建立表之间关联关系的约束,作用是保证数据的完整性和一致性。

外键定义了表之间的引用关系,确保一个表中的值在另一张表中一定存在。

回到前边的问题,如果不设置成外键,会有什么影响?

  1. 无法保证值在另一张表中一定存在
  2. 没办法做到级联操作,需要自己处理级联关系的数据

第一点会导致出现脏数据,比如在订单明细表中填写一个不存在的订单编码,第二点是在删除订单的时候级联删除订单明细,如果没有外键,需要自己手动删除。

为什么很多公司禁止使用外键呢?背后隐藏着什么血与泪呢?

在阿里编码规范中强制禁止使用外键,应该把外键的逻辑关系放到应用层中。


这是因为外键约束会降低数据库的性能,在对性能要求比较高的时候,相比较在应用层保证逻辑正确性的成本要低于使用外键。

课代表

外键(Foreign Key)是一种用来建立表与表之间关联关系的约束,用于保持数据完整性和一致性。

外键的作用有:

  1. 建立关联关系
  2. 保证数据的完整性和一致性
  3. 级联操作

本文主要讲了主键和外键的概念和作用,在工作中,对主键的接触可能比外键多,所以着重介绍了主键的类型选择。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表