我正在使用列user_id
,post_id
,reaction
对反应表进行建模。我希望这一行中的条目是唯一的,可以使用唯一索引轻松实现。
reactions
可以是like
,dislike
,viewed
,applauded
现在的问题是,我还想为like
和dislike
建立一个XOR关系模型,这意味着,当给定的pst和用户已经有一行like
时,它很难用dislike
添加另一行。
由于还有其他可选的反应,我不知道为此编写约束检查。这甚至可能吗?
答案 0 :(得分:1)
您只希望在(user_id, post_id)
为reaction
或'like'
时应用'dislike'
唯一性。那是partial index:
当存在
WHERE
子句时,会创建部分索引。部分索引是一个索引,它只包含表的一部分的条目,通常是比索引的其余部分更有用的索引部分。 [...]另一个可能的应用是使用WHERE
和UNIQUE
来强制表的一个子集的唯一性。
你想要一个像这样的索引:
create unique index INDEX_NAME
on TABLE_NAME (user_id, post_id)
where reaction in ('like', 'dislike')
当然,您可以提供INDEX_NAME
和TABLE_NAME
的值。