【问题标题】:How to let a user insert anywhere in a list?如何让用户在列表中的任何位置插入?
【发布时间】:2012-08-25 17:36:36
【问题描述】:

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

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

然后在获取位置时,我将在我的 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,等等。

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

【问题讨论】:

标签: php mysql algorithm sorting


【解决方案1】:

从代码的角度来看,最简单的方法是使用链表样式,其中您有一个下一个元素 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]--`

【讨论】:

  • 请记住,使用这样的链表会使从数据库中读取有序列表变得困难——您不能再在 sql 中执行 ORDER BY 了。您要么必须一次读取一行,要么在应用程序中进行排序(这就是我要做的)。
  • 正确,您的应用程序将执行排序,但您仍然以相同的方式检索所有相同的数据(请求给定用户的所有元组)。不是按计数或顺序索引,而是按 ID 索引。这使得在数据库中的搜索速度更快,而且当涉及到分页时,您只需提供每个页面上第一个帖子的 id。
猜你喜欢
  • 1970-01-01
  • 2015-05-21
  • 2011-10-20
  • 2021-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-09
相关资源
最近更新 更多