我有一张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)
我们如何建立这些约束条件,以便可以确定给定事件中给定角色的等级,但是角色的等级仅在该事件中是唯一的?
答案 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
是由以下集合描述的实体:
那么您可以设计:
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
必须表示Bad
或Good
,不能同时。
否则,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')