2016-09-26 51 views
1

我对SQL Server相当陌生,所以如果我的问题显得很愚蠢,请致歉。SQL Server - 数据库设计 - 数据完整性 - 强制实施属性值W/O触发器

假定以下业务规则。

  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)`

你能想到的执行规则的任何一个副手是同一个团队中的一员(换句话说 - 来自不同团队的人没有被指定为该团队中的角色的副手),而不是通过触发器?

+0

每当实施参照完整性的唯一方法是通过触发它应该大红色的标志,你的模型不太理想。这似乎就是这种情况。但你至少有几个其他表(团队,用户),你排除但未列出。你能否提供一个更清晰的想法来描述你想要在这里建模? –

+0

我很好奇如果'副'概念应该以不同的方式建模 - 如果它实际上是另一个角色(Role/RoleDeputy)或者它是角色的属性(role.isDeputy)。 “副手”是否是非副手的替补?在一个角色中是否有代表(按优先顺序)的等级制度?所有你需要做的就是扩大代表团队/角色对,以确保代表处在同一个团队中。 – Beth

回答

1

这是逻辑设计。如果你坚持所有表的整数PK,你冷他们到每个表,但仍然必须保持组合键(UNIQUE),并在外键引用它们。


|用户USER_ID存在。

User {USER_ID} 
KEY {USER_ID} 


|团队TEAM_ID存在。

Team {TEAM_ID} 
KEY {TEAM_ID} 


|角色ROLE_ID存在。

Role {ROLE_ID} 
KEY {ROLE_ID} 


|用户USER_ID是团队TEAM_ID的成员。

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

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

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_ID中担任角色ROLE_ID

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

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

对于每个角色和团队角色可能由多个用户在该团队中持有。

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

如果用户在团队中担任角色,则该角色必须存在。

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用于该角色。

每个在一个团队中担任角色(作为主要用户)的用户都可以为该团队中的该角色分配多个代理。

团队中的每个成员可能被分配为多个主要用户的代理人,以担任该团队中的角色。

如果团队中的某个用户被分配了某个角色的副手,那么该用户将在该团队中担任该角色。

如果代理人被分配给在团队中担任角色的用户,则该代理人是该团队的成员。

这是不可能的,一个用户是副本自己。

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 

team_member_deputy