由两个主键标识的值的数据库设计

时间:2018-07-30 01:24:50

标签: database relational-database relational-algebra referential-integrity tuple-relational-calculus

我有一张event_id,role_id和等级表。 下表应有助于可视化我们在约束方面的各种预期结果:

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

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

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

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

2 个答案:

答案 0 :(得分:1)

您需要具有两个唯一的约束。

第一个是string queryString = "*[System[TimeCreated[@SystemTime>='" + dFrom + "' and @SystemTime<='" + dTo + "']" + " and (Level<=2 or " + " (Provider[@Name='<1st name>' or @Name='<2nd name>' or @Name='<3rd name>'] " + " and Level<=" + maxLevel.ToString() + "))" + "]];" Event_Id的“自然”候选密钥。这意味着对于事件和角色的任何给定组合,Role_Id只有一个可能的值。

现在,要强制执行任何给定事件只能具有一个具有给定等级的角色的约束,您需要对Rank加{{1}的组合使用第二个唯一约束 }。

答案 1 :(得分: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)
)

在此设计中,RankId必须表示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')