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

时间:2016-09-26 16:04:12

标签: sql sql-server database database-design

我是SQL Server的新手,所以如果我的问题非常愚蠢,请道歉。

假设以下业务规则。

  1. User可以是0 .. * Teams的成员,因此称为Team_Member
  2. Team_Member在团队中持有0 .. * Roles
  3. Role_in_Team可以有0 .. * Deputies
  4. 表格快照:

    Teams_Members

    • id_team_member(PK - 代理人)
    • team_name(FK - Teams)
    • team_member(FK - 用户)

    Teams_Members_Roles

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

    你能否想到任何一种强制执行规则的方法,即代理人是同一个团队的成员(换句话说 - 来自不同团队的人不被指派为该团队中某个角色的代理人)除了通过触发器?

1 个答案:

答案 0 :(得分: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_IDROLE_ID小组中拥有角色TEAM_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