Ответ 1
"Наивный" подход, который вы предлагаете, также является лучшей практикой!
Предположим, у меня есть некоторые объекты, и я хочу, чтобы пользователь мог изменять их порядок любым способом, скажем, перетаскивая их. Так что я бы
А затем пользователь перетаскивает "молоко" наверх, делая новый заказ
Есть ли лучшая практика, как хранить порядок этих объектов в базе данных? Наивный подход, вероятно, заключался бы в том, чтобы просто хранить числовое значение, называемое "порядок", для каждого объекта, но это кажется мне слишком хлопотным, потому что вам придется перетасовывать значения порядка в большинстве случаев.
"Наивный" подход, который вы предлагаете, также является лучшей практикой!
Лучший способ, который я нашел для этого, - иметь поле порядка с плавающей запятой. Когда вы перемещаете что-то между двумя другими предметами, установите это поле на полпути между его соседями.
Это дешево и для чтения, и для записи. Единственным недостатком является то, что поплавки продолжают увеличиваться:)
Принимая во внимание ответ Тони Эндрюса, вы также можете сохранить "следующий" индекс с каждой записью. Затем, когда вы вытаскиваете их все, пройдите по массиву, следуя цепочке. Это облегчает перемещение элемента, так как вам нужно только коснуться максимум двух строк.
Недостаток этого подхода заключается в том, что если вам когда-либо понадобится подмножество (например, первые 3 элемента), вам все равно нужно задействовать все элементы или использовать цикл SQL. Таким образом, это касается влияния всех строк во время обновления или доступа ко всем элементам во время чтения. Как всегда, измерьте скорость и посмотрите, что лучше для вашей ситуации.
Глядя на Тони Андрея и Марка, в частности, кажется, что у меня действительно есть только две альтернативы:
Meta: Все эти ответы хороши и правильны, что я должен выбрать как правильно?
В моих приложениях операции чтения будут происходить гораздо чаще, чем записи. Пойдите с численным значением, чтобы указать порядок сортировки и справиться со стоимостью переупорядочения предметов. Это более чем компенсируется тем фактом, что вы можете эффективно получать предметы в правильном порядке для целей показа (что в типичном приложении происходит чаще, чем при использовании).
Также, как уже упоминалось, если вы извлекаете подмножество данных (фильтр по типу или что-то еще), остальные элементы все еще находятся в правильном порядке сортировки.
Вспомните мантру К.И.С.С.
Если вы хотите, чтобы они были повторно отображены в том же порядке И вы хотите, чтобы они могли переупорядочиваться в любое время, я не думаю, что вы можете уйти от хранения некоторого значения, которое указывает приоритет отображения в базе данных. Я использовал тот подход, который вы описываете, чтобы заказать элементы в FAQ, исследователи, связанные с грантом, порядок элементов в меню,...
Yup, в реляционной базе данных нет порядка, это одна из фундаментальных концепций. Так что нет никакого способа без численного значения или что-то в этом роде.