1

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

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

然后在获取职位时,我将ORDER BY position ASC在我的 SQL 查询中进行。

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

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

所以项目#4将被放置在位置2,项目#2和3将被推到位置3和4,等等。

完成此插入的最简单/最有效的算法是什么?

4

1 回答 1

3

从代码的角度来看,最简单的方法是使用链表样式,其中您有一个下一个元素 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 个帖子。在传统的数字排序系统中,您现在需要使用 +1 更新来更新 999 行。使用此解决方案,如果您需要在第二个位置插入帖子,您只需查询第一个帖子以获取它的下一个值。获得后,将其更改为新的第二个帖子的值,并将第二个帖子的下一个值设置为第一个帖子最初持有的值。

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

插入后:

[1st Post] -.                          .--> [2nd Post] --Next---> [3rd Post]
            `--Next--> [New 2nd Post]--`
于 2012-08-30T22:19:57.403 回答