我希望模拟 Excel/Google Sheets 中的一项功能,其中有一个数据表,但有人可能会向上或向下移动一行。这是交互的示例:
关于如何将其存储在数据库表中,我的第一个想法是存储一个无符号的
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
但我想知道是否有更好的方法来做到这一点?
使行优先级为浮点数。保留行优先级的索引。
更新行的位置只是将行更新为现有两者之间的值的问题。从给定行开始获取页面就是按优先级顺序获取固定数量的记录,从已知的优先级开始。这离索引非常快。
有时,错误的插入序列可能会导致这些数字之间没有浮点。在这种情况下,您可以轻松地抓取一个行窗口,并修复优先级以在它们之间均匀间隔。此修复的逻辑很复杂,但需要它们的情况非常罕见。
困难的是从第 1500000 行到第 1500049 行抓取窗口。如果这是您实际遇到的特定用例,您可以通过维护一个辅助表来破解它,该辅助表是 32,000 行中的随机一行,以及它和下一个之间有多少个。现在,您可以查询辅助表以获取靠近所需位置的一行已知位置,然后执行第二个查询以查找您想要开始的位置处的行。然后拿起你的窗户。
当然,如果您做到了这一点,您最好只使用专门处理此用例的数据结构。没有多少数据库内置了这个功能。顺便说一句,我想到的唯一一个是Redis有序集,而那不是SQL。然而,如果您希望在 SQL 数据库之外实现此目的,该代码将向您展示如何自行开发。