【问题标题】:Ordering rows depending on user interaction根据用户交互对行进行排序
【发布时间】:2010-03-05 00:03:52
【问题描述】:

假设我有一个用户表。 比如:

ID integer,
USER text,
POSITION integer

我的数据库元组可以是:

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

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

(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 列是正确的方法吗? 有没有办法在不对数据库造成太多点击的情况下完成这项工作?

【问题讨论】:

    标签: sql sqlite


    【解决方案1】:

    您不能做得比您建议的更好 - 每次进行更改时都将更改的元素更新到数据库中。这有时可能意味着对一个小更改进行大更新(例如,在长列表的开头添加一个元素)。

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

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

    【讨论】:

      【解决方案2】:

      按照您的建议使用POSITION 列是完全有效的。数据库读取的数量将取决于您创建的索引表中的行数。

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

      【讨论】:

        猜你喜欢
        • 2013-09-15
        • 1970-01-01
        • 2015-10-17
        • 2021-08-04
        • 2021-08-09
        • 1970-01-01
        • 2016-09-25
        • 2014-07-04
        • 1970-01-01
        相关资源
        最近更新 更多