Я хочу сохранить большой упорядоченный список (миллионы элементов) в хранилище данных Google App Engine.Требуется быстрая вставка.
Самый простой способ - добавить индексированное свойство (или столбец) "order_num", представляющее порядок.Например, список [A, B, C] будет храниться так:
content order_num
--------------------
A 1
B 2
C 3
Однако это не дает вам быстрой вставки.Например, если я хочу вставить X после A, мне нужно изменить нумерацию B и C, чтобы «освободить место» для X, т. Е. Пусть B станет 3, C станет 4, а X будет 2. Это было бы катастрофой, если бы яимеют миллионы элементов.
Я нашел выполнимое решение, названное "подход с разрывом", описанное здесь .Этот подход сохраняет разрыв между смежными элементами.Например:
content order_num
--------------------
A 1000
B 2000
C 3000
Когда я хочу вставить X после A, я могу просто добавить X с его порядковым номером (1000 + 2000) / 2 = 1500, перенумерация не требуется.
Но с уменьшением этих пробелов может потребоваться перенумерация.У меня вопрос, есть ли известная стратегия по нумерации?И решить размер пробелов?
Спасибо!
ОБНОВЛЕНИЕ
Вот более подробно.Скажем, у меня есть список элементов в базе данных, и каждый элемент имеет целочисленное свойство с именем my_num.Значение my_num - произвольное положительное целое число.Предположим, у меня есть список [A, B, C, D], и их my_num
element my_num
---------------------
A 5
B 2
C 10
D 7
Теперь давайте определим оператор мог ():
accum(n) = element[0].my_num + element[1].my_num + ... + element[n-1].my_num
Итак, накопзначения для каждого элемента:
element my_num accum
----------------------------
A 5 5
B 2 7
C 10 17
D 7 24
Но накопленные значения, вероятно, НЕ должны храниться в базе данных, поскольку список постоянно обновляется.Лучше быстро вставлять.
Я хочу создать запрос, в качестве входного значения которого используется целое число x:
query(x) = element[i] if accum(i-1) < x <= accum(i)
Например, query (11) - это C, а query (3) -A.
Можно ли спроектировать схему хранилища данных, чтобы сделать этот запрос быстрым?Или единственный способ накапливать его один за другим во время запроса, что я планирую сделать?