数据库表关系
了解数据库中的表之间如何相互关联。
关系是在包含相关信息的表中具有有意义的关联——它们使数据库变得有用。如果数据库中的表之间没有任何连接,您可能还不如使用独立的电子表格文件,而不是数据库系统。
正如我们在数据库简短概述中所述,数据库是表的集合,这些表具有字段(也称为列)。每个表都包含一个称为实体(或主)键的字段,该字段标识表中的行。通过告知数据库一个表中的键值对应于另一个表中的键值,您就在这些表之间创建了关系;这些关系使得跨数据库中的不同表运行强大查询成为可能。当一个表的实体键链接到第二个表时,它在第二个表中被称为外键。
识别表之间所需连接是数据建模和模式设计过程的一部分——也就是说,确定数据如何组合在一起,以及如何配置表及其字段的过程。这个过程通常涉及创建表及其关系的视觉表示,称为实体关系图 (ERD),其中不同的符号指定关系的类型。您表之间的关系可以是
仔细考虑表之间的关系也有助于确保数据的完整性、准确性,并尽量减少数据冗余。
一对一关系
在一对一关系中,一个表中的记录只能对应另一个表中的一个记录(或者在某些情况下,没有记录)。一对一关系并不常见,因为在许多情况下,您可以将相关信息存储在同一个表中。是否将这些信息分成多个表取决于您的整体数据模型和设计方法;如果您保持表尽可能精简(例如在规范化数据库中),那么您可能会发现一对一关系很有用。
一对一关系示例
假设您正在组织公司的员工信息,并且还想跟踪每位员工的计算机。由于每位员工只有一台计算机,并且这些计算机不与员工共享,您可以在 Employee 表中添加字段来存储每台计算机的品牌、年份和操作系统等信息。然而,从语义角度来看,这可能会变得混乱——计算机信息是否*真的*属于关于员工的表中?这由您决定,但另一种选择是创建一个 Computers 表,并将其与 Employee 表建立一对一关系,如下面的图所示。

在这种情况下,我们 Employee 表中的实体键将作为 Computers 表的外键。您可能有一些尚未分配给员工的计算机,并且这种建模确保您仍然可以在 Computer 表中保留它们的记录。如果员工离职,您只需要更新一个字段,并且可以轻松地将计算机链接到新员工。
ERD 中用于连接表的线条(称为乌鸦脚表示法)的确切格式各不相同;有时您会看到表示一对一关系的直线,有时这些线条会带有交叉影线。
一对一关系也可以用于安全目的,例如,如果您想将敏感的客户信息存储在单独的表中,您可以使用外键将其链接到主 Customers 表。
一对多关系
一对多关系是数据库表中关系最常见的类型。在一对多(有时称为多对一)关系中,一个表中的记录对应于另一个表中的零个、一个或多个记录。
一对多关系示例
例如,考虑客户及其订单的表,如 Metabase 的示例数据库中那样,People 表中的一条记录可以链接到 Orders 表中的多条记录。在这种情况下,一位客户可以下多个订单,并且这些多个订单记录都将链接回 People 表中的单个记录。这种连接通过 User_ID 字段进行编码,该字段是 People 表中的主键,也是 Orders 表中的外键。下图显示了这两个表如何相互关联。

虽然一个人可以链接到多个订单,但反之则不然——订单只链接到 People 表中的单个记录,并且没有多个客户。
多对多关系
多对多关系表示一个表中的多个记录链接到另一个表中的多个记录。这些记录可能只与单个记录关联(或根本不关联),但关键是它们可以并且通常会链接到多个记录。在实际数据库用例中,多对多关系并不常见,因为遵循规范化通常需要将多对多关系分解为单独的、更专注的表。
事实上,您的数据库系统可能甚至不允许创建直接的多对多关系,但您可以通过创建一个名为连接表的第三个表来解决此问题,并与您的两个起始表之间创建一对多关系。
从这个意义上说,Metabase 示例数据库中的 Orders 表充当连接表,在 People 和 Products 之间创建中间链接。示例数据库的 ERD 如下所示,其中每个关系都由连接表的线条类型指定。

严格来说,Products 和 Orders 表之间存在一对多关系,因为一个产品可以与多个订单关联。但根据我们虚构公司的数据库,人们似乎只订购一种产品(他们会因为某种原因购买五个轻量级羊毛电脑)。这个数据库的实际(也许更具商业头脑的)实现可能包含这两个表之间的连接表,使得订单可以包含多种不同的产品。