1

有 3 个表,即 FN、ADM、USR 代表一个功能,该功能的管理员,参加该功能的用户。Admin 将是一个用户,ADM 必须从 USR 继承。
FN_I,USR_I 应该是 FN 和 USR 的主键。(这被许多其他表引用)
ADMN 是新添加的

在此处输入图像描述

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

我尝试通过将FN_ADM_I设置为FN_I的外键来实现1。
有人可以帮助我解决可以同时满足这两个要求的约束/关系吗?

4

2 回答 2

1

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

FN_ADMIN_REL

FN_I, -- PK
ADMIN_I --PK 

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

ALTER TABLE FN_ADMIN_REL
ADD CONSTRAINT uc_Func_Admin UNIQUE (FN_I, ADMIN_I)
于 2011-05-23T11:35:50.643 回答
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 记录)
  • 最后一部分是Admins和Functions之间的关系。由于没有管理员可以管理多个功能,这也是一对零或一。但是,在这种情况下,我们会将 ADM_I 列添加到 FUN 表中,并将其作为 ADM 表中 ADM_I 列的外键。这将给我们一对多。现在我们可以在 FUN 表中的 ADM_I 列上创建一个 UNIQUE 约束,以使这种关系成为一对零的关系。

这有意义吗?

于 2011-05-23T11:36:12.503 回答