Как эффективно обновить пользовательский индекс при вставке строки? - PullRequest
2 голосов
/ 23 августа 2011

Мы используем Django.

У нас есть модельный объект Story, который имеет N объектов Section, упорядоченных по настраиваемому полю «index».Это отражается в базе данных как таблица разделов, имеющая столбец «index» и столбец «story_id».

Когда добавляется новый раздел, мы просто создаем его с новым «index», который является максимальным.

Пока все хорошо.

Проблема в том, что мы хотим вставить раздел, который будет упорядочен между двумя уже существующими разделами.Как эффективно добавить новую запись Раздела, но расположить ее между двумя индексами?

Допустим, у нас есть Раздел с идентификатором A и индексом 1. И Раздел с идентификатором B и индексом 2. Я хочу добавитьИдентификатор секции C, но с индексом от 1 до 2, чтобы убедиться, что он находится между A и B.

Предусмотренное нами решение:

  1. Используйте целочисленные индексы, при вставке раздела просто обновляйте индексыиз всех следующих разделов для того же идентификатора истории.Выглядит, может быть, немного излишне, я не знаю.
  2. Используйте индексы с плавающей запятой, при вставке Раздела просто создайте новый индекс, который находится между предыдущим и следующим индексом, как 0,5 для Раздела между индексом Раздела 1и 2. Может быть, полон сюрпризов, поэтому я не уверен, но самое простое решение для реализации.
  3. Удалите поле индекса и просто убедитесь, что каждый раздел знает следующий идентификатор раздела (и, возможно, предыдущийИдентификатор раздела тоже).Работает как связанный список, поэтому вставка проста и эффективна, НО, как же тогда получить упорядоченный список Раздела?На данный момент мы понятия не имеем ...

Как бы это был хороший способ сделать это?

1 Ответ

0 голосов
/ 19 апреля 2012

Для варианта № 1, насколько неэффективным будет следующее?

from django.db.models import F

section = Section.objects.create(...)
Section.objects.filter(
    index__gte=section.index,
    #...
).exclude(pk=section.pk).update(index=F('index') + 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...