Мне нужно иметь возможность хранить большой список заказанных предметов в БД.Пока это просто:
ID Position OtherFields
1 45 ...
2 4736 ...
3 514 ...
...
В запросах мне всегда нужно получать только несколько элементов (отфильтрованных на основе других полей), но в правильном порядке.Также легко, поставить индекс на Позицию и использовать «Порядок по Позиции».
Теперь проблема : Предметы часто меняют свое Положение, а не только на 1 или 2. Если ID 2изменяет Позицию с 4736 на 2000, мне нужно обновить ее Позицию и Позицию всех элементов между старыми Позицией 2000 и 4735, добавив 1 в каждой строке.И это не только один идентификатор, который изменяется для каждой транзакции, но и несколько, и может быть много транзакций в течение короткого времени.
Я думаю, что самый элегантный способ решить проблему update будетиспользуя связанный список вместо столбца Position, где я могу просто удалить ID 2 из его старой позиции, связав его предшественника с его преемником, а затем вставить его в другое место, связав его между своим новым предшественником и преемником.Это будет постоянное и небольшое количество обновлений на изменение позиции, и это также будет моим предпочтительным способом обработки изменений (в моем случае в Java).Однако это поднимает проблему N + 1 для запросов в правильном порядке - даже для нескольких элементов мне нужно просмотреть весь список в худшем случае, чтобы выяснить их правильный порядок.
Итак, мой вопрос : Что бы вы посоветовали, чтобы получить хороший баланс между необходимыми обновлениями и производительностью запросов?
Пока я вижу два многообещающих направления:
Существует ли СУБД (в идеале OpenSource), которая может обрабатывать связанные списки не только с синтаксическим сахаром, но и с хорошей производительностью, например, используя внутренние индексы для связанных элементов?
Может быть, будет также вариант иметь BLOB, в котором будет храниться весь связанный список!Насколько большим может быть такой Связанный список / сколько памяти он будет использовать в БД, и когда будет получено, скажем, 1.000.000 записей?Я использую Java + Hibernate в случае, если это имеет значение.Я предполагаю, что обработка даже всего списка в памяти после извлечения BLOB должна быть довольно быстрой!?
Но, конечно, приветствуются и другие идеи!