数据库表关系
了解数据库中的表如何相互关联。
关系是包含相关信息的表之间的有意义关联——它们是使数据库有用的原因。如果没有数据库中表之间的某些联系,您可能还不如使用分散的电子表格文件而不是数据库系统。
正如我们在《数据库基础》简短概述中所述,数据库是表集合,这些表有字段(也称为列)。每个表都包含一个称为实体(或主键)的字段,它标识该表中的行。通过告诉数据库一个表中的键值对应于另一个表中的键值,您在这些表之间创建一个关系;这些关系使您能够在数据库中的不同表中运行强大的查询。当一个表的实体键链接到第二个表时,在第二个表中称为外键。
确定表之间需要的联系是数据建模和模式设计过程的一部分——即弄清楚您的数据如何组合在一起,以及您应该如何配置表及其字段的过程。这个过程通常涉及创建表及其关系的视觉表示,称为实体关系图(ERD),用不同的符号指定关系的类型。您表之间的关系可以是
考虑您的表应该如何相互关联也有助于确保数据完整性、数据准确性,并将冗余数据降至最低。
一对一关系
在一对一关系(one-to-one)中,一个表中的记录只能对应另一个表中的一个记录(在某些情况下,没有记录)。一对一关系并不是最常见的关系,因为在很多情况下,你可以在同一个表中存储对应的信息。是否将信息拆分到多个表中取决于你的整体数据模型和设计方法;如果你尽可能地保持表的高度专注(如在一个规范化的数据库中),那么一对一关系可能会很有用。
一对一关系示例
假设你在公司组织员工信息,同时你还想跟踪每位员工的电脑。由于每位员工只有一台电脑,并且这些电脑不会在员工之间共享,你可以在Employee
表中添加字段,存储每台电脑的品牌、年份和操作系统等信息。然而,从语义的角度来看,这可能会变得很混乱——电脑信息真的属于员工信息表吗?这由你决定,但另一个选择是创建一个与Employee
表建立一对一关系的Computers
表,如下面的图所示
在这种情况下,我们Employee
表中的实体键作为Computers
表的外键。你可能有一些还没有分配给员工的电脑,这种建模确保你可以在Computer
表中为它们保留记录。如果员工离职,你只需要更新一个字段,就可以轻松地将电脑与新的员工关联起来。
用于连接ERD(实体关系图)中表的线条的格式(称为鸟嘴符号)可能会有所不同;有时你会看到表示一对一关系的普通线条,有时这些线条会有交叉线。
一对一关系对于安全目的也很有用,例如,如果你想在单独的表中存储敏感的客户信息,并用外键将其链接到主Customers
表。
一对多关系
一对一关系是数据库中表之间最常见的类型。在一对多(有时称为多对一)关系中,一个表中的记录对应另一个表中的零个、一个或多个记录。
一对多关系示例
例如,考虑客户和他们的订单的表,就像在Metabase的示例数据库中,其中People
表中的一个记录可以与Orders
表中的多个记录相关联。在这种情况下,一位客户可以下多个订单,而这些多个订单记录都将链接到People
表中的一个单一记录。这种联系是通过User_ID
字段来编码的,它是People
表的主键,也是Orders
表的外键。下面的图显示了这两个表之间的关系
尽管一个人可以与多个订单相关联,但反之则不成立——订单只与People
表中的一个单一记录相关联,并且没有多个客户。
多对多关系
多对多关系表示一个表中的多条记录与另一个表中的多条记录相关联。这些记录可能只与一条记录(或没有任何记录)相关联,但关键在于它们可以,并且通常与多条记录相关联。在实际数据库使用案例中,多对多关系并不常见,因为遵循规范化通常涉及将多对多关系拆分为更独立的、更集中的表。
实际上,您的数据库系统甚至可能不允许创建直接的多对多关系,但您可以通过创建一个称为连接表的第三张表来解决这个问题,并在它和您的两个起始表之间创建一对一关系。
在这种意义上,Metabase样本数据库中的Orders
表充当连接表,在People
和Products
之间建立中间链接。样本数据库的ERD看起来可能像下面的图像,其中每个关系由连接表使用的线型来指定。
从技术上讲,Products
和Orders
表之间存在一对一关系,即一个产品可以与多个订单相关联。但根据我们的虚构公司的数据库,人们似乎只订购一种产品(他们可能会出于某种原因购买五台轻便羊毛电脑)。在现实世界中(也许更有商业头脑)的数据库实现中,可能包括两个表之间的连接表,使得订单可以包含许多不同的产品。
进一步阅读
下一节:度量值和维度
如何在查询中处理定量和定性字段。