如何在数据库中存储行位置?

问题描述 投票:0回答:1

我希望模拟 Excel/Google Sheets 中的一项功能,其中有一个数据表,但有人可能会向上或向下移动一行。这是交互的示例:

enter image description here

关于如何将其存储在数据库表中,我的第一个想法是存储一个无符号的

INT4
和行位置。例如,如果表有两个字段
name
age
,则表将具有以下结构:

`row_num`   `name`    `age`
 1           tom      10
 2           angel    20

然后,例如,如果将第二行移动到第一行之前,则这两行的

row_num
都会发生变化。但是,我想知道什么可能是更有效的方法来做到这一点。假设我有 10 亿行,我将倒数第二行移动到倒数第二行:所有 1B 的
row_num
都需要更新。我想执行如下所示的
UPDATE
语句可能是实现此目的的一种方法:

UPDATE myTbl row_num=CASE 
                        WHEN $moved_selection...
                        WHEN $changed_section...
                      ELSE row_num END

但我想知道是否有更好的方法来做到这一点?

sql database algorithm sorting
1个回答
0
投票

使行优先级为浮点数。保留行优先级的索引。

更新行的位置只是将行更新为现有两者之间的值的问题。从给定行开始获取页面就是按优先级顺序获取固定数量的记录,从已知的优先级开始。这离索引非常快。

有时,错误的插入序列可能会导致这些数字之间没有浮点。在这种情况下,您可以轻松地抓取一个行窗口,并修复优先级以在它们之间均匀间隔。此修复的逻辑很复杂,但需要它们的情况非常罕见。

困难的是从第 1500000 行到第 1500049 行抓取窗口。如果这是您实际遇到的特定用例,您可以通过维护一个辅助表来破解它,该辅助表是 32,000 行中的随机一行,以及它和下一个之间有多少个。现在,您可以查询辅助表以获取靠近所需位置的一行已知位置,然后执行第二个查询以查找您想要开始的位置处的行。然后拿起你的窗户。

当然,如果您做到了这一点,您最好只使用专门处理此用例的数据结构。没有多少数据库内置了这个功能。顺便说一句,我想到的唯一一个是Redis有序集,而那不是SQL。然而,如果您希望在 SQL 数据库之外实现此目的,该代码将向您展示如何自行开发。

© www.soinside.com 2019 - 2024. All rights reserved.