【发布时间】:2022-05-06 12:22:22
【问题描述】:
假设我有一个名为 list 的表,其中有类似这样的 items(ids 是随机 uuid):
id rank text
--- ----- -----
x 0 Hello
x 1 World
x 2 Foo
x 3 Bar
x 4 Baz
我想保持rank 列总是从0 到n-1 的属性(n 是行数)---如果客户要求insert 带有@987654330 的项目@,那么pg服务器应该将当前的3和4分别推送到4和5:
id rank text
--- ----- -----
x 0 Hello
x 1 World
x 2 Foo
x 3 New Item!
x 4 Bar
x 5 Baz
我目前的策略是有一个专用的插入函数add_item(item) 扫描整个表,过滤掉排名等于或大于被插入项目的项目,并将这些排名加一。但是,我认为这种方法会遇到各种各样的问题——比如竞态条件。
是否有更标准的做法或更稳健的方法?
注意:排名列完全独立于其余列,插入不是我需要支持的唯一操作。将其视为可排序待办事项列表的后端,用户可以动态添加/删除/重新排序项目。
【问题讨论】:
-
这可以是计算列吗?排名是如何确定的,是否可以存储一个属性,以便可以按需计算排名?
-
看起来是个坏主意...为什么存储列表顺序很重要?更标准的方法是只插入未排序的并仅在输出点应用订单。
-
@Glenn 不幸的是,没有。排名完全是任意的,实际上是数据的一部分(用户可能能够即时重新排序列表)。
-
请告诉我们真正的问题是什么。
-
@TimBiegeleisen 抱歉,我刚刚更新了问题以使我的意图更加明确。
标签: postgresql