Изменение порядка строк в базе данных SQL - идея

Я думал о простом переупорядочении строк в таблице реляционной базы данных. Я хотел бы избежать метода, описанного здесь: Как я могу изменить порядок строк в базе данных SQL

Моя простая идея заключалась в том, чтобы использовать в качестве столбца ListOrder тип 64-битной плавающей запятой IEEE 754 с двойной точностью. Вставляя строку между двумя существующими строками, мы вычисляем значение listOrder как среднее значение этих элементов-братьев.

Пример:

1. Исходное состояние:

value, listOrder
a       1
b       2
c       3
d       4
e       5
f       6

2. Перемещение "е" на два ряда вверх

Одно простое обновление sql для электронной строки: update mytable set listorder=2.5 where value='e'

value, listOrder
a       1
b       2
e       2.5
c       3
d       4
f       6

3. Перемещение на одну позицию вниз

value, listOrder
b       2
a       2.25
e       2.5
c       3
d       4
f       6

У меня вопрос. Сколько вставок я могу выполнить (в крайнем положении), чтобы получить правильно упорядоченный список.
Для 64-битного целого числа в одном месте менее 64 вставок. Разве типы с плавающей точкой позволяют больше вставок?

Есть другие проблемы с описанным подходом? Видите ли вы какие-либо исправления / корректировки, чтобы сделать эту идею безопасной и пригодной для использования в приложениях?

1 ответ

Решение

Это похоже на лексический порядок, который также можно сделать с колонками varchar:

В
С
D
Е
F

становится

В
BM
С
D
F

становится

В
BF
BM
С
D
F

Я предпочитаю двухэтапный процесс, когда вы обновляете каждую строку в таблице после той, которую вы перемещаете, чтобы она была больше. Sql эффективен в этом, когда обновление строк после изменения не так плохо, как кажется. Вы сохраняете что-то, что будет более читабельным для человека, размер хранилища для ваших порядковых значений масштабируется линейно, а не по размеру ваших данных, и вы не рискуете прийти к точке, где вам не хватает точности, чтобы поместить элемент между двумя ценности

Другие вопросы по тегам