我怎样才能以可以随时重新排列顺序的方式构建我的数据库表?
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 也必须更新。这在速度方面会有非常显着的差异吗?
我正在做一个个人项目,基本上是将富文本编辑器的输出保存到数据库中,以便以后可以在不同的设备上再次访问。用户可以在不同章节或主题的注释中添加"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 也必须更新。这在速度方面会有非常显着的差异吗?