2012-02-21 39 views
1

我有一个存储在数据库表中的对象列表(称为“阶段”)。什么是一个很好的方法来模拟一个值表中的序列?

我需要维护列表中阶段的顺序。我想知道什么是建模的好方法?

我想我会给Phase对象一个“int sequence”属性来决定顺序,既然它被保存到表中,我可以按顺序读回它们。我看到的唯一问题是,当我改变序列的顺序时,我必须重新计算列表中每个阶段的所有序列值。例如,交换#2和#3的位置会导致#3之后的所有内容(比如#1000)必须在db中更新。

有没有一种更简单的方法来模拟,我没有考虑过?

+0

为什么你不能使用小数点排序? – 2012-02-21 16:33:58

+0

你可以把它作为一种链表,而不是有一个'next_phase_id'的序号。不知道这是否会更容易。 – Russell 2012-02-21 16:36:39

+0

同样在你的例子中,交换#2和#3并不意味着你需要更新任何其他的。 *删除*#2或#3意味着你必须更新所有这些。 – Russell 2012-02-21 16:37:31

回答

1

我会按照你所描述的方式去做。

是,如果要插入新的值,然后如果你已经使用了连续的等级值,则需要撞击现有值,说

UPDATE table SET rank = rank + 1 WHERE rank >= ? 

由此可见,你通常不能使排名列因为你不知道UPDATE将以什么顺序处理。

如果您以编程方式访问数据库,您可以允许非连续的等级值,因此只有在不存在的情况下才会碰撞现有等级编号顺序中没有差距。另外,如果您使用的是基于行/基于页面的数据库,则可以考虑将排名带到一个单独的表中,该表中只有主记录的ID和排名值。然后,如果您确实需要对排名进行大规模更新,则不必读取和写入整个主记录,而只需要包含几个整数的记录。

1

如何在不影响任何其他记录的情况下调换排序位置。

UPDATE 
    phases 
SET 
    sort_pos = CASE WHEN sort_pos = 2 THEN 3 ELSE 2 END 
WHERE 
    sort_pos IN (2, 3) 


你有一种“瀑布效应”的唯一情况是,当你移动一个记录的排序顺序中的新位置。

您可以通过将sort_pos存储为浮点来处理。因此,您可以将记录推入排序位置2.5。唯一不利的一面是,你不能写一个查询说,“让我第9件”,因为它可能是排序为98.5,或实际上任何其他值什么如此。

相关问题