根据用户交互排序行

时间:2010-03-05 00:03:52

标签: sql sqlite

假设我有一个用户表。 类似的东西:

ID integer,
USER text,
POSITION integer

我的db元组可以是:

(1, "user1", 1);
(2, "user2", 2);
(3, "user3", 3);

我的应用列出了所有用户,并且可以对其进行重新排序。 例如: 您可以在user2之前使用户3。

(1, "user1", 1);
(2, "user2", 3);
(3, "user3", 2);

此外,您可能想要将某人移到第一位。 例如:如果你有......

(1, "user1", 1);
(2, "user2", 2);
(3, "user3", 3);

...然后你将user3移到第一位,db应该是:

(1, "user1", 2);
(2, "user2", 3);
(3, "user3", 1);

使用POSITION列的方法是否正确? 有没有办法在没有太多命中数据的情况下完成这项工作?

2 个答案:

答案 0 :(得分:2)

根据您的建议使用POSITION列完全有效。 DB读取的数量取决于表中您创建的索引的行数。

如果您指的是将用户所做的更改保存回数据库,除非要提交许多更改,否则只需发出UPDATE语句即可。

答案 1 :(得分:2)

除了建议之外,您无法做得更好 - 每次进行更改时都要将更改的元素更新到数据库。这有时可能意味着对较小的更改进行大量更新(例如,在长列表的开头添加元素)。

一个小的改进是删除位置必须是从1开始的连续数字的限制。您可以改为允许位置可以是100,200,300并使用ORDER BY以正确的顺序获取行。这样就可以在两个现有项目之间插入一个新项目,而不必修改任何其他元素,至少在你的序列用完差距并且需要对其进行“碎片整理”之前。

但在我看来,实施这个系统的额外努力可能不值得。简单的解决方案适用于大多数用途。