相关疑难解决方法(0)

任意排序表中的记录

使用数据库时的一个常见需求是按顺序访问记录。例如,如果我有一个博客,我希望能够以任意顺序重新排列我的博客文章。这些条目通常有很多关系,因此关系数据库似乎很有意义。

我见过的常见解决方案是添加一个整数列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以使它们按正确的顺序排列。

然而,这似乎很笨拙:

  • 如果我想将记录 0 移到开头,我必须对每条记录重新排序
  • 如果我想在中间插入一条新记录,我必须在它之后重新排列每条记录
  • 如果我想删除一条记录,我必须在它之后对每条记录重新排序

很容易想象这样的情况:

  • 两条记录相同 order
  • order记录之间有间隙

由于多种原因,这些可能很容易发生。

这是 Joomla 等应用程序采用的方法:

Joomla 的订购方法示例

你可能会争辩说这里的界面很糟糕,他们应该使用箭头或拖放而不是人类直接编辑数字——你可能是对的。但在幕后,同样的事情正在发生。

有些人建议使用小数来存储订单,这样你就可以使用“2.5”在订单 2 和 3 的记录之间插入一条记录。虽然这有点帮助,但可以说它更混乱,因为你最终可能会得到奇怪的小数(你在哪里停?2.75?2.875?2.8125?)

有没有更好的方法将订单存储在表中?

database-design order-by database-agnostic relational-theory

32
推荐指数
3
解决办法
9346
查看次数

SQL 中用户定义的排序

我刚刚阅读了一篇关于用户定义结果集排序的有趣博客文章

某些应用程序,例如待办事项列表,需要维护用户定义的项目顺序。挑战在于顺序是任意的,并且可以在用户重新排列项目时改变

一个示例表可能是这样的:

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列,并且只更新单行userordertimestamp值(使用ORDERing by检索查询userorder asc, usertimestamp desc),但是当您需要在具有相同值的其他两行之间移动一行时失败.

没有考虑特定的数据库,因为我自己使用的范围很广。

order-by

7
推荐指数
2
解决办法
1478
查看次数

最有效的订购后数据库设计

我有 post_order 列的帖子表。我将每个帖子的顺序存储在其中。当我将一行的顺序从 25 更改为 15 时,我应该将所有行从 15 更新到结尾。它适用于几行,但在数千行中最糟糕。

有没有更好的订购帖子的设计,更有效?

mysql database-design design-pattern

4
推荐指数
1
解决办法
317
查看次数