2009-08-07 54 views
3

我知道如何在SQL Server中创建一对多,多对多的关系,但可以创建一对一的关系吗?是否有可能创建1到0或1的关系?Sql中的关系

回答

3

是的,只是把PRIMARY KEY小号两个实体的成链接表,在两个实体定义UNIQUE键:

myrel(entityA, entityB, UNIQUE(entityA), UNIQUE(entityB)) 

因此,如果entityA = 1有关entityB = 2

entityA entityB 
     1  2 

,您可以将entityA = 1与任何其他entityB都不相关,也不会将entityB = 2与任何其他entityA相关联。

如果关系是对称(即entityAentityB属于相同的域和与entityAentityB也指与entityBentityA),则定义一个额外CHECK constrant:

entityA entityB 

UNIQUE(entityA) 
UNIQUE(entityB) 
CHECK(entityA < entityB) 

和改造与此查询的规范化关系的归一化关系:

SELECT entityA, entityB 
FROM myrel 
UNION 
SELECT entityB, entityA 
FROM myrel 

这是一个(0-1):(0-1)的关系。

如果你希望它是一个1:1关系,定义这个表是两个entityAentityB域:

myrel(entityA, entityB, UNIQUE(entityA), UNIQUE(entityB)) 
A(id, PRIMARY KEY(id), FOREIGN KEY(id) REFERENCES myrel (entityA)) 
B(id, PRIMARY KEY(id), FOREIGN KEY(id) REFERENCES myrel (entityB)) 

通过或者从表的定义中删除FOREIGN KEY,你改变的相应部分关系从1(0-1)

+0

1到0或1的关系呢? – 2009-08-07 16:27:46

0

是的,只需将从属表中的主键或备用键作为父表中的主键的外键即可。

+0

1到0或1的关系? – 2009-08-07 16:31:13

+0

我所描述的是一个1比0或1的关系。在子表中,父表中的每一行都不必有记录... – 2009-08-07 18:11:59

0

表A ID PK

表B ID PK FK表A

+0

修改如何?例如房间与经理有1:1关系,有些经理被解雇了,如何更新? – Dewfy 2009-08-07 16:28:18

+0

您还忘记了唯一的约束 – Dewfy 2009-08-07 16:29:09

+0

要管理它,您需要级联数据库级别或数据访问层级别。 – Ray 2009-08-07 16:57:52

0

这很有趣,但在接受采访是我不喜欢的问题。

所以你有表A,B对应的每一个都有主键A_ID,B_ID。将外键添加到任何。让它成为B:A_REF,所以你只需要在A_REF上添加唯一约束。

+0

+1,因为你是对的,但你能更详细地解释一下吗? – edebill 2009-08-07 16:29:42

+0

1比0或1的关系? – 2009-08-07 16:32:22

+0

表A ID是PK(自动使其唯一)并且是表B ID的FK,它也是PK(自动使其唯一)。 – Ray 2009-08-07 17:00:25

1

两种方式: 1)pk-pk 1:1关系。表A和B都有PK。 1关系

2)的FK/UC-PK 1:1:1的关系,从B到PK A的PK这使得 'B' 的1的FK侧创建FK。表A有一个PK,而表B有一个到A的外键,但B中的FK不在B的PK上。现在在B的FK字段中创建一个UC。

+0

1到0或1的关系? – 2009-08-07 16:33:33

+0

在方法1中,如何向A和B中插入新条目?方法2最终不是“1比0或1”关系吗? – 2009-08-07 16:53:00

+0

@ArsenMkrt:使FK可以为空。 @Jonathan:方法1很容易插入。由于B依赖于A,所以首先在A中插入行,然后在B中插入行.A不指向B,B只指向A.方法2不是1..0..1的关系,if你让FK不能为空,如果FK边是可选的,它只会被选中。 – 2009-08-09 08:07:06