假设我有一个用户表。 类似的东西:
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
列的方法是否正确?
有没有办法在没有太多命中数据的情况下完成这项工作?
答案 0 :(得分:2)
根据您的建议使用POSITION
列完全有效。 DB读取的数量取决于表中您创建的索引的行数。
如果您指的是将用户所做的更改保存回数据库,除非要提交许多更改,否则只需发出UPDATE
语句即可。
答案 1 :(得分:2)
除了建议之外,您无法做得更好 - 每次进行更改时都要将更改的元素更新到数据库。这有时可能意味着对较小的更改进行大量更新(例如,在长列表的开头添加元素)。
一个小的改进是删除位置必须是从1开始的连续数字的限制。您可以改为允许位置可以是100,200,300并使用ORDER BY以正确的顺序获取行。这样就可以在两个现有项目之间插入一个新项目,而不必修改任何其他元素,至少在你的序列用完差距并且需要对其进行“碎片整理”之前。
但在我看来,实施这个系统的额外努力可能不值得。简单的解决方案适用于大多数用途。