如何有效地更新行插入的自定义索引?

时间:2011-08-23 14:06:44

标签: sql django

我们正在使用Django。

我们有一个模型对象Story,其中N Section对象按自定义字段“index”排序。这在数据库中反映为具有“索引”列和“story_id”列的Section表。

当添加新的部分时,我们只使用一个新的“索引”来创建它。

到目前为止一切顺利。

问题是:我们要插入一个将在两个已存在的部分之间排序的部分。如何有效地添加一个新的Section条目,但使它在两个索引之间定位?

假设我们有一个id为A且索引为1的Section,以及一个id为B且索引为2的Section。 我想添加一个Section id C但索引在1和2之间,以确保它在A和B之间。

我们设想的解决方案:

  1. 使用整数索引,在部分插入时,只需更新相同Story ID的所有以下部分的索引。看起来有点矫枉过正,我不知道。
  2. 使用浮点索引,在段插入时只生成一个介于上一个索引和下一个索引之间的新索引,如段落索引1和2之间的段为0.5。可能会充满惊喜,所以我不确定,但最简单的解决方案。
  3. 删除索引字段,并确保每个部分都知道以下部分ID(也可能是之前的部分ID)。像链接列表一样工作,因此插入简单而有效但是如何检索Section的有序列表呢?目前我们不知道......
  4. 如何做到这一点好方法?

1 个答案:

答案 0 :(得分:0)

对于选项#1,以下是多么低效?

from django.db.models import F

section = Section.objects.create(...)
Section.objects.filter(
    index__gte=section.index,
    #...
).exclude(pk=section.pk).update(index=F('index') + 1)