问题描述
|
共有3个表格,分别代表FN,ADM,USR
功能,该功能的管理员,参加该功能的用户。
管理员将是用户,并且ADM必须从USR继承。
FN_I,USR_I应该是FN和USR的主键。(许多其他表引用了)ADMN是新添加的功能
我需要实现以下约束。
1.一个功能只能有一个管理员。(1-1)
2.一个管理员只能管理一个功能。(1-0 / 1)
我尝试通过将FN_ADM_I设置为FN_I的外键来实现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(一对一)的关系并不完全是您所想的。
无论如何,如果我正确地理解了您的问题(很容易就不可能是这种情况),这就是您的工作。
您已经有FN和USR表,每个表上都有主键。
从逻辑上讲,参加某个功能的用户是多对多关系:一个用户可以参加很多功能,而每个功能可以由许多用户参加。传统上由sql server中的“ link \”表建模的多对多关系。您创建具有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约束,以使这种关系为一对零。
这有意义吗?