3个表之间的一对一关系(背靠背 - 1对1关系)

时间:2011-05-23 11:03:56

标签: sql sql-server tsql table-relationships

有3个表,即FN,ADM,USR代表a 功能,管理功能,参加功能的用户。 管理员将是用户,ADM必须从USR继承 FN_I,USR_I应该是FN和USR的基本密钥。(许多其他表引用了这一点)
ADMN是新增的能力

enter image description here

我需要实施以下限制 1.一个功能只能有一个管理员。(1-1)
2.一个管理员只能管理一个功能。(1-0 / 1)

我尝试通过将FN_ADM_I设置为FN_I的外键来实现1使用。
是否有人可以帮助我实现可以同时满足要求的约束/关系?

2 个答案:

答案 0 :(得分:1)

您可能想要创建一个链接表:

FN_ADMIN_REL

FN_I, -- PK
ADMIN_I --PK 

其中两个字段都是具有UNIQUE约束的主键:

ALTER TABLE FN_ADMIN_REL
ADD CONSTRAINT uc_Func_Admin UNIQUE (FN_I, ADMIN_I)

答案 1 :(得分:1)

我认为你在这里混淆了术语。我认为1-1(一对一)关系并不完全符合您的想法。

无论如何,如果我正确理解你的问题(很容易就是这种情况),这就是你所做的。

  • 您已经拥有FN和USR表,每个表都有主键。
  • 逻辑上参加功能的用户是多对多关系:用户可以参加许多功能,每个功能都可以被许多用户参加。传统上由sql server中的“链接”表建模的多对多关系。您创建具有FN_I字段和USR_I字段的FN_USR表,并将这些外键分别设置为FN和USR。这是您将功能与主要用户连接的方式。 (注意,在你的图表中,这两个表之间没有任何关系,所以我只是猜测你想要多对多,你没有明确指定这个。)
  • 现在让我们看看ADM表。这一个“继承”来自USR。在sql server中没有表继承的概念。这通常通过一对一或一对一的关系建模。您创建和ADM表,并将主ADM_I作为此表中的主键。您还可以将它作为USR表中USR_I列的外键。这就是管理员/用户关系的建模方式。每个管理员都是用户(每个ADM记录都有相关的USR记录)但不是每个用户都是管理员(并非每个USR记录都有相关的ADM记录)
  • 最后一部分是管理员和职能部门之间的关系。由于没有管理员可以管理多个功能,因此这也是一对一或一个。但是,在这种情况下,我们将ADM_I列添加到FUN表中,并将其作为ADM表中ADM_I列的外键。这将给我们一对多。现在我们可以在FUN表中的ADM_I列上创建一个UNIQUE约束,使这种关系从一到零。

这有意义吗?