使用数据库时的一个常见需求是按顺序访问记录。例如,如果我有一个博客,我希望能够以任意顺序重新排列我的博客文章。这些条目通常有很多关系,因此关系数据库似乎很有意义。
我见过的常见解决方案是添加一个整数列order
:
CREATE TABLE AS your_table (id, title, sort_order)
AS VALUES
(0, 'Lorem ipsum', 3),
(1, 'Dolor sit', 2),
(2, 'Amet, consect', 0),
(3, 'Elit fusce', 1);
Run Code Online (Sandbox Code Playgroud)
然后,我们可以对行进行排序order
以使它们按正确的顺序排列。
然而,这似乎很笨拙:
很容易想象这样的情况:
order
order
记录之间有间隙由于多种原因,这些可能很容易发生。
这是 Joomla 等应用程序采用的方法:
你可能会争辩说这里的界面很糟糕,他们应该使用箭头或拖放而不是人类直接编辑数字——你可能是对的。但在幕后,同样的事情正在发生。
有些人建议使用小数来存储订单,这样你就可以使用“2.5”在订单 2 和 3 的记录之间插入一条记录。虽然这有点帮助,但可以说它更混乱,因为你最终可能会得到奇怪的小数(你在哪里停?2.75?2.875?2.8125?)
有没有更好的方法将订单存储在表中?
database-design order-by database-agnostic relational-theory
某些应用程序,例如待办事项列表,需要维护用户定义的项目顺序。挑战在于顺序是任意的,并且可以在用户重新排列项目时改变
一个示例表可能是这样的:
create table items
(
itemid int primary key,
itemdata varchar(200),
...
...
userorder ???
);
Run Code Online (Sandbox Code Playgroud)
使用可能的检索查询:
select * from items order by userorder asc;
Run Code Online (Sandbox Code Playgroud)
考虑到我希望将更新保持在最低限度、更新原子性和检索查询尽可能简单和“高效”,我是否应该考虑任何方法?
我最初的想法是使用一个额外的TIMESTAMP
列,并且只更新单行userorder
的timestamp
值(使用ORDER
ing by检索查询userorder asc, usertimestamp desc
),但是当您需要在具有相同值的其他两行之间移动一行时失败.
没有考虑特定的数据库,因为我自己使用的范围很广。
我有 post_order 列的帖子表。我将每个帖子的顺序存储在其中。当我将一行的顺序从 25 更改为 15 时,我应该将所有行从 15 更新到结尾。它适用于几行,但在数千行中最糟糕。
有没有更好的订购帖子的设计,更有效?