什么是对值表中的序列进行建模的好方法?

时间:2012-02-21 16:32:15

标签: mysql database-design

我有一个对象列表(称为“阶段”),我将其存储在db表中。

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

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

是否有一种更简单的方法来模拟这个我没有考虑过的方法?

2 个答案:

答案 0 :(得分:1)

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

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


只有当您将一条记录移动到排序顺序中的新位置时,才会出现“级联”效果。

您可以通过将sort_pos存储为float来处理它。因此,您可以将记录推送到排序位置2.5。唯一的缺点就是你不能再编写一个“让我得到第9项”的查询,因为它可能是排序顺序98.5,或实际上任何其他有价值的东西。

答案 1 :(得分:1)

我按照你描述的方式做。

如果您想插入新值,则为是,如果您使用了连续的排名值,那么您需要提高现有值,例如

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

由此可见,您通常不会将排名列设为唯一,因为您不知道UPDATE的处理顺序。

如果您以编程方式访问数据库,则可以允许非连续的排名值,因此只有在编号序列中没有间隙时才需要碰撞现有的排名。

此外,如果您使用的是基于行/页面的数据库,则可以考虑将排名放到单独的表中,该表只包含主记录的ID和排名值。然后,如果您确实需要对排名进行批量更新,则不必读取和写入整个主记录,而只需要包含几个整数的记录。