表和有效数据如下所示:
| id | after_id |
| -- | -------- |
| a | null |
| b | a |
| c | b |
| d | c |
我们的目标是防止这样的事情发生
| id | after_id |
| -- | -------- |
| a | d | <- 'a' now follows 'd', creating a loop.
| b | a |
| c | b |
| d | c |
如果不存储一些有助于创建约束的附加信息,似乎就不可能解决这一问题。但我不知道什么信息会有帮助。Postgresql有EXCLUDE
约束,我认为可能会以某种方式使用重叠操作符。不知道如何解决这个问题,但我有一种感觉,它需要更新太多的行,这将破坏在链接列表中存储序列的全部意义。
UPD:这样做是为了确保列表在数据库级别上的完整性,而不是应用程序级别。另一个无效状态的示例:
| id | after_id |
| -- | -------- |
| a | null |
| b | d | <- updated
| c | b |
| d | c |
或者另一个:
| id | after_id |
| -- | -------- |
| a | null |
| b | d | <- updated: followed 'a', now follows 'd'
| c | b |
| d | c |
| e | a | <- updated: followed 'd', now follows 'a', unique constraint on after_id will not be violated this way
https://stackoverflow.com/questions/68161627
复制