0

我有一个 event_id、role_id 和 rank 表。下表应该有助于可视化我们期望的关于约束的各种结果:

   scenario    Event_Id    Role_Id    Rank
      1            1           1        1    good
      2            1           2        1    bad
      3            2           1        1    good

Event_Id 是 Event 表的主键。
Role_Id 是 Role 表的主键。
使用事件和角色,我们可以找到与该给定事件的该角色相关联的等级。

一个角色可以用于具有不同等级的多个事件(场景 1 和 3)
但是,对于同一事件,两个角色不应具有相同的等级。(场景 1 和 2)

我们如何建立这些约束,以便我们可以在给定事件中识别给定角色的等级,但角色的等级仅在该事件中是唯一的?

4

2 回答 2

1

你需要有两个独特的约束。

第一个是您的“自然”候选键Event_Idplus Role_IdRank这意味着对于任何给定的事件和角色组合,您只有一个可能的值。

现在,要强制任何给定 Event 只能有一个具有给定 Rank 的 Role 的约束,您需要对plus的组合进行第二个唯一约束Event_IdRank

于 2018-07-30T01:32:33.283 回答
0

为什么不同的Rank具有相同的候选主键

Rank = 1表示不好...

如果Rank是由一组描述的实体,例如:

  • 1 -> 不好
  • 2 -> 好

然后你可以设计:

create table Events(EventId int, primary key(EventId))
create table Roles(RoleId int, primary key(RoleId))
create table Ranks(RankId int, Title varchar(...), primary key(RankId))    
create table EventRoleRank(
    EventId int,
    RoleId int,
    RankId int,
    primary key(EventId, RoleId, RankId)
)

在这个设计中,RankIdMUST 意味着一个BadGood而不是两个

如果,否则,RankId = 1必须Bad在一种情况下和Good另一种情况下表示,那么:

create table Events(EventId int, primary key(EventId))
create table Roles(RoleId, primary key(RoleId))
create table EventRoleRank(
    EventId int,
    RoleId int,
    RankId int,
    RankTitle varchar(...),
    primary key(EventId, RoleId)
)

insert into EventRoleRank(1, 1, 1, 'good')
insert into EventRoleRank(1, 2, 1, 'bad')
于 2018-07-30T01:43:07.230 回答