【发布时间】:2015-03-14 06:39:59
【问题描述】:
我有一个网站,其管理员用户登录到限制区域并添加显示在公共区域的内容。管理员希望在帖子插入/编辑表单上有一个简单的输入文本字段,他可以在其中键入一个数字,以确定该帖子将在哪个位置显示给公众。
因此,如果“Foo”帖子的编号为 3,则应将其列在第 3 位,旧帖子 3 应变为 4,4 应变为 5,依此类推。如果帖子 5 重新定位为 1,1 应自动变为 2,2 应变为 3,依此类推。如果管理员重新定位,3 到 2,2 应仅变为 3,无需更改其他位置。如果10变成9,9变成10,也不需要改变其他职位的位置。简而言之,当一个帖子的位置发生变化(或插入现有帖子的中间)时,其余帖子的位置应相应移动。
我考虑了两种可能性:
- 创建一个疯狂的算法,选择所需的每个帖子并更新
position列; - 在表中实现一个链表,以便每个帖子始终知道下一个帖子的主键是什么。
使用第一个选项,当管理员插入或更新帖子的位置时,所有工作都在那一刻完成,当访问公共站点时,SQL 只是在单个查询中选择所有需要的帖子并对其进行排序通过position。我还不知道我将如何实现它,但我确信使用大量代码和可能的糟糕权衡是可能的。
使用第二个选项,在插入/更新期间完成的工作要少得多,但是当用户访问该站点时,我需要为每个帖子做一个选择,以便使用每个帖子的链接来实现正确的定位下一个“节点”。因此,如果我在给定类别中有 150 个帖子,我将不得不运行 150 个选择(对于当前“节点”指向的每个帖子一个选择。在这种情况下不会使用分页,只有标题会真正列出来,一个在另一个之下,所以,我将它们全部列出。
我想就我所描述的两种可能性提出其他方法、见解或改进建议。
解决方案
我接受了@FractlizeR 的回答,因为它使用了一些其他成熟的软件来支持他的选择。
我wrote a small prototype on the solution I ended up using at work。当然,我在工作中使用的代码是不同的,因为我正在更改遗留系统。尽管如此,我还是使用了与原型中完全相同的 SQL 方法。我希望我能尽快改进那个原型,特别是它的 cmets,但至少它在那里,以防我或其他人需要做类似的事情。
【问题讨论】:
-
如何使用浮动来指示帖子的位置?这样,您可以在其他两个帖子之间移动帖子,并且仍然可以使用简单的 select 语句。例如,如果一个帖子被移动到第三个位置(2 到 3 之间),你只需给它 2.5 的位置。
-
@Faris 这将变成复杂的逻辑,以在不断重新排序同一项目时尽量不耗尽浮点数的精度;)
-
只是为了让大家了解情况,我不得不在工作中切换到不同的任务,并且将在两三天内回到这个问题。到时候我会考虑大家的建议。感谢到目前为止所有帮助过的人。顺便说一句,here's a post that made me consider a linked list.