如何让用户插入列表中的任何位置


How to let a user insert anywhere in a list?

我有一个存储在数据库中的项目列表。每个项目都有一个id列、一个title和一个position列(int)。

默认情况下,每当用户向列表中添加新项目时,其id都会放在该位置。因此,如果你有3个项目,id为1、2、3,它们的位置也将为1、3、2。

然后在获取位置时,我将在SQL查询中执行ORDER BY position ASC

问题是,用户想要一个可以在现有项目中的任何位置添加新项目的功能。

因此,如果你有位置为1、2、3的项目1、2和3,他可以选择在位置2添加一个新项目,这将导致项目1、2中、3、4具有位置:1 3 4 2

因此,项目#4将被放在位置2,项目#2和3将被向下推到位置3和4,等等。

实现插入的最简单/最有效的算法是什么?

从代码的角度来看,最简单的方法是使用链表样式,其中有下一个元素id,而不是顺序值。这在小列表中不太有用,但当您开始增加列表大小时,它会使更新/移动/删除更加干净,并防止可能更新数千个元组来更改1个顺序。

++我手头没有一个确切的代码示例,但你可以调用用户的所有列表

SELECT Posts.id, Posts.next, Posts.content, User.firstPost FROM db.posts AS Posts 
JOIN db.user as User ON Posts.ownerid = User.id 
WHERE User.id='123' AND Posts.active = 1;

这将获得单个用户的所有帖子,然后您将有一个包含下一个帖子id的字段。首先,您需要一个密钥来识别第一篇帖子(将第一篇帖子的id存储在用户信息中)。在你提取第一个帖子后,你会获取它的"下一个"值,并用它来识别下一个帖子。

对于一个短列表来说,这似乎有点疯狂,但想想一个有1000条帖子的用户。如果他们需要在第二个位置增加一个职位。在传统的数字排序系统中,您现在需要用+1更新其他999行。使用此解决方案,如果您需要在第二个位置插入帖子,只需查询第一个帖子即可获得其下一个值。一旦有了它,就可以将其更改为新的第二个post的值,并将第二个post的下一个值设置为第一个post最初持有的值。

[1st Post] --Next---> [2nd Post] --Next---> [3rd Post]

插入后:

[1st Post] -.                          .--> [2nd Post] --Next---> [3rd Post]
            `--Next--> [New 2nd Post]--`