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