我怎样才能以可以随时重新排列顺序的方式构建我的数据库表?

How can I structure my database tables in such a way that their orders can be rearranged at any time?

我正在做一个个人项目,基本上是将富文本编辑器的输出保存到数据库中,以便以后可以在不同的设备上再次访问。用户可以在不同章节或主题的注释中添加"pages"。

我 运行 遇到的问题是我无法调整 运行 笔记的顺序,或在某处插入新页面。我目前的解决方案是有 2 个 ID——一个是主索引 (ID),另一个是相对 ID (RID)。要后置运行 行,我只需更改该行的 RID,然后在显示它们时按 RID 对行进行排序。

ID | RID | page_title | page_content
01 | 01  | Hello      | Hello world
02 | 02  | Goodbye    | See ya

这在我的页面很少时有效,但如果我有 100 页并且我想后 运行ge 或在中间插入新行,我必须更改 RID对于下方进行更改的每一行。

构建我的 table 的正确方法是什么,以便它可以轻松地后 运行ge 或稍后插入?我熟悉 MySQL 使用 PhpMyAdmin 和使用 SQLAlchemy 的 SQLite。

抱歉,如果之前有人问过这个问题,很难将这个问题表述为 google 搜索,我一直得到不相关的结果。提前致谢!

有很多方法可以做到这一点。一种简单的方法是将页面视为链接列表。使用指向 (FK) 这些页面之前的页面的 prior 列,而不是顺序列。

例如从 a-b-c-d 顺序的页面开始:

id, page name, prior
1, a, null
2, b, 1
3, c, 2
4, d, 3
5, e, 4

要将页面“b”移动到页面“d”之后,您需要:

(1) 改变 c 在 1 之前

(2) 在 4

之前更改 b

(3) 改变 2

之前的 e

在交易中完成所有这些,你就成功了。新列表如下所示:

id, page name, prior
1, a, null
2, b, 4
3, c, 1
4, d, 3
5, e, 2

无论您的总页数是多少,都需要相同数量的操作(单链表为 3 个)。

请务必测试移动第一页 (prior=null) 的实现,因为这是一种特殊情况。

刚刚想到了另一种解决方案,但不知道这样会带来什么样的弊端。

将订单作为 ID 列表(即 1、2、3、4、5)与列表 ID 一起保存到单独的 table。

(Pages Table)
ID, page, listID
1, a, 1
2, b, 1
3, c, 1
4, d, 1
5, e, 1

(Lists Table)
ListID, list_sequence
1, (1,2,3,4,5)

每次订单更改时,将新订单保存到列表Table。检索要显示的数据时,首先从列表 Table 中检索 list_sequence,然后执行类似

的操作
for id in list_sequence:
    Pages.query.get(id)
    // display the row

这样,将根据指定的顺序依次检索行。每次重排只会写入一次数据库。

如果有充分的理由不使用此方法,请告诉我!

编辑:list_sequence 列将保存为字符串。

编辑 2:这将为每次插入添加另一个操作。必须插入新行,然后 list_sequence 也必须更新。这在速度方面会有非常显着的差异吗?