模型XOR检查唯一约束

时间:2018-03-08 01:26:31

标签: sql postgresql database-design constraints

我正在使用列user_idpost_idreaction对反应表进行建模。我希望这一行中的条目是唯一的,可以使用唯一索引轻松实现。

reactions可以是likedislikeviewedapplauded

现在的问题是,我还想为likedislike建立一个XOR关系模型,这意味着,当给定的pst和用户已经有一行like时,它很难用dislike添加另一行。

由于还有其他可选的反应,我不知道为此编写约束检查。这甚至可能吗?

1 个答案:

答案 0 :(得分:1)

您只希望在(user_id, post_id)reaction'like'时应用'dislike'唯一性。那是partial index

  

当存在WHERE子句时,会创建部分索引。部分索引是一个索引,它只包含表的一部分的条目,通常是比索引的其余部分更有用的索引部分。 [...]另一个可能的应用是使用WHEREUNIQUE来强制表的一个子集的唯一性。

你想要一个像这样的索引:

create unique index INDEX_NAME
on TABLE_NAME (user_id, post_id)
where reaction in ('like', 'dislike')

当然,您可以提供INDEX_NAMETABLE_NAME的值。