当一个表具有引用另一个表的主键的外键时,在两个数据库表之间建立关系。这是术语关系数据库背后的基本概念。
外键如何建立关系
让我们回顾一下主键和外键的基础知识。主键唯一标识表中的每条记录。它是一种候选键,通常是表中的第一列,可以由数据库自动生成,以确保它是唯一的。
外键是用于将记录链接到另一个表中的数据的另一个候选键(不是主键)。
例如,考虑这两个表,确定哪个教师教授哪个课程。
这里,Courses表的主键是Course_ID。它的外键是Teacher_ID:
COURSE_ID | 课程名 | Teacher_ID |
---|---|---|
Course_001 | 生物学 | Teacher_001 |
Course_002 | 数学 | Teacher_001 |
Course_003 | 英语 | Teacher_003 |
您可以看到课程中的外键与教师中的主键匹配:
Teacher_ID | 老师的名字 |
---|---|
Teacher_001 | 卡门 |
Teacher_002 | 维罗尼卡 |
Teacher_003 | 乔治 |
我们可以说,Teacher_ID外键有助于建立一个 关系 在课程和教师表之间。
数据库关系的类型
使用外键或其他候选键,您可以在表之间实现三种类型的关系:
一比一:这种类型的关系只允许关系两侧的一条记录。
主键仅与另一个表中的一个记录(或无记录)相关。例如,在婚姻中,每个配偶只有一个其他配偶。这种关系可以在单个表中实现,因此不使用外键。
一到多:一对多关系允许一个表中的单个记录与另一个表中的多个记录相关联。
考虑具有包含Customers和Orders表的数据库的业务。
单个客户可以购买多个订单,但单个订单无法链接到多个客户。因此,Orders表将包含与Customers表的主键匹配的外键,而Customers表将没有指向Orders表的外键。
许多一对多:这是一种复杂的关系,其中表中的许多记录可以链接到另一个表中的许多记录。例如,我们的业务可能不仅需要Customers和Orders表,而且可能还需要Products表。
同样,Customers和Orders表之间的关系是一对多关系,但请考虑Orders和Products表之间的关系。订单可以包含多个产品,产品可以链接到多个订单:多个客户可能会提交包含某些相同产品的订单。这种关系至少需要三张桌子。
什么是数据库关系重要?
在数据库表之间建立一致的关系有助于确保数据完整性,有助于数据库规范化。例如,如果我们没有通过外键链接任何表,而只是组合Courses和Teachers表中的数据,如下所示:
Teacher_ID | 老师的名字 | 课程 |
---|---|---|
Teacher_001 | 卡门 | 生物学,数学 |
Teacher_002 | 维罗尼卡 | 数学 |
Teacher_003 | 乔治 | 英语 |
这种设计不灵活,违反了数据库规范化的第一个原则,即第一范式(1NF),它规定每个表格单元格应包含单个独立的数据。
或许我们决定只为卡门添加第二条记录,以强制执行1NF:
Teacher_ID | 老师的名字 | 课程 |
---|---|---|
Teacher_001 | 卡门 | 生物学 |
Teacher_001 | 卡门 | 数学 |
Teacher_002 | 维罗尼卡 | 数学 |
Teacher_003 | 乔治 | 英语 |
这仍然是一个弱设计,引入了不必要的重复和所谓的 数据插入异常 ,这只意味着它可能导致不一致的数据。
例如,如果教师有多个记录,如果需要编辑某些数据,但执行数据编辑的人没有意识到存在多个记录,该怎么办?然后,该表将包含同一个人的不同数据,没有任何明确的方法来识别或避免它。
将此表分为两个表,即教师和课程(如上所示),在数据之间创建正确的关系,从而有助于确保数据的一致性和准确性。