Подтвердить что ты не робот

Как сохранить определенный, изменяемый "порядок" в базе данных

Предположим, у меня есть некоторые объекты, и я хочу, чтобы пользователь мог изменять их порядок любым способом, скажем, перетаскивая их. Так что я бы

  • Сыр
  • Кексы
  • Молоко

А затем пользователь перетаскивает "молоко" наверх, делая новый заказ

  • Молоко
  • Сыр
  • Кексы

Есть ли лучшая практика, как хранить порядок этих объектов в базе данных? Наивный подход, вероятно, заключался бы в том, чтобы просто хранить числовое значение, называемое "порядок", для каждого объекта, но это кажется мне слишком хлопотным, потому что вам придется перетасовывать значения порядка в большинстве случаев.

4b9b3361

Ответ 1

"Наивный" подход, который вы предлагаете, также является лучшей практикой!

Ответ 2

Лучший способ, который я нашел для этого, - иметь поле порядка с плавающей запятой. Когда вы перемещаете что-то между двумя другими предметами, установите это поле на полпути между его соседями.

Это дешево и для чтения, и для записи. Единственным недостатком является то, что поплавки продолжают увеличиваться:)

Ответ 3

Принимая во внимание ответ Тони Эндрюса, вы также можете сохранить "следующий" индекс с каждой записью. Затем, когда вы вытаскиваете их все, пройдите по массиву, следуя цепочке. Это облегчает перемещение элемента, так как вам нужно только коснуться максимум двух строк.

Недостаток этого подхода заключается в том, что если вам когда-либо понадобится подмножество (например, первые 3 элемента), вам все равно нужно задействовать все элементы или использовать цикл SQL. Таким образом, это касается влияния всех строк во время обновления или доступа ко всем элементам во время чтения. Как всегда, измерьте скорость и посмотрите, что лучше для вашей ситуации.

Ответ 4

Глядя на Тони Андрея и Марка, в частности, кажется, что у меня действительно есть только две альтернативы:

  • Сохранение "следующего" значения, что приводит к тому, что объекты ведут себя как связанный список (см. Ответ от ответа)
    При этом изменение порядка дешево, но мне нужно будет получить элементы, а затем отсортировать их по их "следующему" значению, что дорого.
  • Сохранение значения "порядок" (см. ответ Тони Эндрю)
    Это делает получение дешевого, но сохранение нового порядка потенциально дорогостоящим, потому что в худшем случае мне придется изменить все значения порядка. cletus указывает, что для множителя порядка можно было бы использовать большое число в виде 2 ^ n.

Meta: Все эти ответы хороши и правильны, что я должен выбрать как правильно?

Ответ 5

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

Также, как уже упоминалось, если вы извлекаете подмножество данных (фильтр по типу или что-то еще), остальные элементы все еще находятся в правильном порядке сортировки.

Вспомните мантру К.И.С.С.

Ответ 6

Если вы хотите, чтобы они были повторно отображены в том же порядке И вы хотите, чтобы они могли переупорядочиваться в любое время, я не думаю, что вы можете уйти от хранения некоторого значения, которое указывает приоритет отображения в базе данных. Я использовал тот подход, который вы описываете, чтобы заказать элементы в FAQ, исследователи, связанные с грантом, порядок элементов в меню,...

Ответ 7

Yup, в реляционной базе данных нет порядка, это одна из фундаментальных концепций. Так что нет никакого способа без численного значения или что-то в этом роде.