首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL Server - DB设计-数据完整性-强制属性值W/O触发器

SQL Server - DB设计-数据完整性-强制属性值W/O触发器
EN

Stack Overflow用户
提问于 2016-09-26 16:04:12
回答 1查看 80关注 0票数 1

我对Server相当陌生,所以如果我的问题非常愚蠢,我很抱歉。

假设以下业务规则。

  1. User可以是0.* Teams的成员,因此称为Team_Member
  2. Team_Member cand在团队中保持0..* Roles
  3. Role_in_Team可以有0.* Deputies

表的快照:

Teams_Members

  • id_team_member (PK -代孕)
  • team_name (FK -团队)
  • team_member (FK -用户)

Teams_Members_Roles

  • id_team_member (FK - Teams_Members)
  • 角色(FK -角色)
  • 代理(FK -用户)或(FK - Teams_Members)`

你能想到有什么办法来执行这样一条规则:一名副手是同一个团队的成员(换句话说,一个来自不同团队的人不被指派为该团队中某一角色的副手),而不是通过一个触发器?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-27 13:20:03

这是逻辑设计。如果您坚持对所有表都使用整数PKs,则可以将添加到每个表中,但仍然必须保持复合键(唯一),并在外键中引用它们。

\用户USER_ID存在。

代码语言:javascript
运行
复制
User {USER_ID}
 KEY {USER_ID}

\ Team TEAM_ID存在。

代码语言:javascript
运行
复制
Team {TEAM_ID}
 KEY {TEAM_ID}

\角色ROLE_ID存在。

代码语言:javascript
运行
复制
Role {ROLE_ID}
 KEY {ROLE_ID}

\用户USER_ID是Team TEAM_ID的成员。

对于每个用户,该用户可能是多个团队的成员;对于每个团队,可能有多个用户是该团队的成员。

如果用户是团队的成员,那么该用户必须存在,并且该团队必须存在。

代码语言:javascript
运行
复制
TeamMember {USER_ID, TEAM_ID}
       KEY {USER_ID, TEAM_ID}

FOREIGN KEY {USER_ID} REFERENCES User {USER_ID}
FOREIGN KEY {TEAM_ID} REFERENCES Team {TEAM_ID}

\用户USER_ID在team TEAM_ID中持有角色ROLE_ID

对于每个用户和团队,该用户可以在该团队中担任多个角色。

对于每个用户和角色,该用户可以在多个团队中担任该角色。

对于每个角色和团队,该角色可能由一个以上的用户担任。

如果用户在团队中担任角色,那么该用户就是该团队的成员。

如果用户在团队中拥有一个角色,那么该角色就必须存在。

代码语言:javascript
运行
复制
TeamMemberRole {USER_ID, TEAM_ID, ROLE_ID}
           KEY {USER_ID, TEAM_ID, ROLE_ID}

FOREIGN KEY {USER_ID, TEAM_ID} REFERENCES TeamMember {USER_ID, TEAM_ID}
FOREIGN KEY {ROLE_ID}          REFERENCES Role {ROLE_ID}

_用户PRIMARY_ID持有角色ROLE_ID,作为团队TEAM_ID中的主要用户,为该角色指定代理DEPUTY_ID

每个在团队中作为主要用户的角色的用户可以在该团队中为该角色指派多个代理。

团队的每一位成员都可以被指派为一个以上的主要用户的代理,担任该团队中的一个角色。

如果一个团队中的用户被分配了一个角色的代理,那么该用户在该团队中占有该角色。

如果一个代理被分配给一个在团队中扮演角色的用户,那么该代理就是该团队的成员。

用户不可能是自己的副手。

代码语言:javascript
运行
复制
TeamDeputy {PRIMARY_ID, TEAM_ID, ROLE_ID, DEPUTY_ID}
       KEY {PRIMARY_ID, TEAM_ID, ROLE_ID, DEPUTY_ID}

FOREIGN KEY {PRIMARY_ID, TEAM_ID, ROLE_ID} REFERENCES TeamMemberRole {USER_ID, TEAM_ID, ROLE_ID}
FOREIGN KEY {DEPUTY_ID, TEAM_ID} REFERENCES TeamMember {USER_ID, TEAM_ID}

CHECK PRIMARY_ID <> DEPUTY_ID

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39707454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档