数据库设计基础:如何创建“一对一”关系(1:1),以及在什么情况下需要这种关系,简单的例子说明。
当我们需要 "一对一" (1:1) 关系时?
当表 A 中的一条记录只能属于表 B 中的一条特定记录,而此时,表 B 中的一条记录也只能属于表 A 中的一条特定记录。
让我们考虑一个真实例子:假设我们需要在数据库中存储用户及其护照信息。护照信息的输入是可选的,因此我们不会将其存储在与用户相同的表中。
一个人只能有一本护照。对于任何特定的护照,也可以这么说:它只能属于一人。
如何创建 "一对一" (1:1) 关系?
需要在表 A 中(在我们的例子中是用户表)添加一个字段,用于存储表 B 中记录的 ID(唯一标识符)(在我们的例子中是护照表)。在护照表中添加一个字段,用于存储用户表中记录的 ID。这样,我们就创建了一对一关系,因为我们只能在一条记录的关系列中存储另一张表的一个 ID。
id - 每条记录在任何表中都有的唯一(不重复)编号(多对多关系表除外,但我们稍后会讨论这一点)。在一个表中不能有两个相同的 id,这让我们能够100%准确地通过其唯一编号获得所需的记录。
一对一 (1:1) 关系是这样的:
需要注意的是,尽管从架构角度来看,这确实代表真正的一对一关系,但在实际情况下,这种关系很少以双向格式建立,因为我们只需在表 B(护照)中指明一个字段,用于存储表 A(用户)中记录的 ID。
然而,实际上以这种方式创建的关系只能算作一对多,我们应该铭记一对一关系,不要在护照表中创建不同的记录指向同一个用户。如果这点记在心中有困难,请创建如上所示的双向关系。
以下是我们如何简化一对一关系,实际上创建一个一对多关系(只要我们将其用作一对一!):
如何处理 "一对一" (1:1) 关系?
让我们用我们的例子来分析。这是我们如何从用户表中获取一些用户数据及其一些护照信息:
SELECT
u.id,
u.email,
u.role,
p.firstname,
p.date_of_birth,
p.registration_address
FROM
user u,
passport p
WHERE
p.user = u.id
AND
c.user = ?;
在这里,N 的位置需要替换为用户的唯一编号。如果我们想获得所有用户及其护照信息,我们可以在 "p.user = u.id" 后添加分号,并删除下面的所有内容。
在邻近的文章中,您可以找到关于其他类型的关系数据关系的信息:多对多,以及一对多。如果您发现内容有用,可以通过喜欢/评论/订阅我的 教育 YouTube 频道来支持我。