零或一到零或一的关系

7
有没有办法在数据库中创建一个从0到1的关系?例如,我有一个经理表和一个艺术家表。一个经理只能管理一个艺术家,而一个艺术家也只能有一个经理。但是,一个经理可能没有艺术家(即正在寻找要管理的艺术家),而一个艺术家可能没有经理。是否有任何方法可以实现这一点?在任一表中创建外键只会创建一个一对多的关系。
4个回答

12

这很简单。

你有一个可能不存在的1:1关系。

因此,你有一个可空的唯一外键,因此可以指定为空。

类似以下内容:

CREATE TABLE manager (
    id int primary key,
    ....
);

CREATE TABLE artist (
     id int primary key,
     manager_id int unique references manager(id)
     ...
);

现在,艺术家不能有超过一个经纪人,经纪人也不能代理超过一个艺术家。此外,艺术家不得拥有经纪人。


1
在大多数关系型数据库管理系统中,这只允许您创建一个未受管理的艺术家。唯一约束将不允许第二个NULL - Bret
4
SQL 标准规范确实指出 UNIQUE 约束在检查唯一性时必须忽略 NULL 值。大多数 RDBMS 都正确实现了这一点:Oracle / PostgreSQL / MySQL / MariaDB。但是 SQL Server 没有,不过可以通过在约束条件上添加 WHERE column IS NOT NULL 子句来获得相同的行为。 - Maxime Rossini

2

我认为,应该有一个单独的表格来管理关系。它将包含两个表格的键,但会有一个限制来防止重复的组合键。

这样,您无需为没有艺术家的经理或没有任何经理的艺术家插入键(避免空条目)。


1
我相信你需要两个唯一约束,一个在关系表的每个字段上。 - Hutch

0

我会在经纪人表上放置一个指向他们管理的艺术家的外键字段,允许为空。

然后您可以使用它来查找他们正在管理的艺术家,并查找特定艺术家的经理。


0
在关系型数据库中,表之间可以有三种关系:

一对一; 一对多; 多对多

虽然不存在一对零的关系,但在实际工作中可能会遇到一对零的情况,即某些数据存在一对零的关系,但不能像一对一、一对多或多对多关系那样明确定义一对零的关系。


你甚至不能像“一对一”或“一对多”这样定义这种关系。它们实际上是概念,有不同的方法可以处理它们。 - Lali
好的,是的,我也是这个意思 (Y) - Saqib Javed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接