我的应用程序有多个用户和每个用户的可订购列表。列表中的项目可以被软删除。架构如下。
create table list_item (
id serial primary key
user_id integer not null, -- Foreign key
sort integer not null, -- The position in the list
deleted_at timestamptz, -- Time of deletion, null if not deleted
...
)
(user_id, sort)
必须是唯一的,因为每个列表中的每个位置只能有一个项目。为了支持软删除,我从索引中排除deleted_at is null
项。所以我有以下索引:
create unique index on list_item (user_id, sort) where deleted_at is null;
现在,无论何时创建或删除列表项,我都需要移动(递增/递减)所有sort
值。这可能会违反唯一索引,除非将其设置为可延迟(或者我使用效率较低的变通方法来强制执行更新顺序)。但是不可能有一个可推迟的部分唯一索引。
我该如何解决这个问题?我该如何改变设计?