Лучший способ сохранить заказанный Список к Базе данных при хранении упорядочивания

68
задан Machavity 30 June 2017 в 20:15
поделиться

8 ответов

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

24
ответ дан Galwegian 24 November 2019 в 14:16
поделиться

К сожалению, нет никакого чудодейственного средства для этого. Вы не можете гарантировать порядок никакого SELECT оператор БЕЗ порядка пунктом. Необходимо добавить столбец и программу вокруг этого.

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

Жаль я ничего не могу предложить лучше, Hope, которой это помогло.

5
ответ дан Binary Worrier 24 November 2019 в 14:16
поделиться

Я не рекомендовал бы A, AA, B, BA, подход BB вообще. Существует большая дополнительная обработка, включенная для определения иерархии, и вставка промежуточных записей не является забавой вообще.

Просто добавляют OrderField, целое число. Не используйте разрывы, потому что тогда необходимо или работать с нестандартным 'шагом' на следующей средней вставке, или необходимо будет ресинхронизировать список сначала, затем добавить новую запись.

Наличие 0... N легко переупорядочить, и если можно использовать методы Массива или методы Списка за пределами SQL для переупорядочивания набора в целом, затем обновить каждую запись, или можно выяснить, где Вы вставляете в, и +1 или-1 каждая запись после или перед ним соответственно.

, Как только у Вас есть немного библиотеки, записанной для него, это будет кусок пирога.

4
ответ дан Adam 24 November 2019 в 14:16
поделиться

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

по линии при нахождении этого ограничения из-за низкой производительности на вставках и обновлениях тогда возможно использовать varchar поле, а не целое число. Это допускает вполне высокий уровень точности при вставке. например, вставить между объектами и 'B' можно вставить объект, заказанный как 'AA'. Это - почти наверняка излишество для магазинной тележки все же.

1
ответ дан Jack Ryan 24 November 2019 в 14:16
поделиться

Я рекомендовал бы сохранить разрывы в номере заказа, таким образом, вместо 1,2,3 и т.д., используйте 10,20,30... Если необходимо просто вставить еще один объект, Вы могли бы поместить его в 15, вместо того, чтобы переупорядочить все в той точке.

0
ответ дан harriyott 24 November 2019 в 14:16
поделиться

Ну, я сказал бы, что короткий ответ:

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

0
ответ дан sindre j 24 November 2019 в 14:16
поделиться

На уровне абстракции над корзиной Items, скажем, CartOrder (который имеет 1-n с CartItem), вы можете поддерживать поле с именем itemOrder, которое может быть просто разделенным запятыми списком идентификаторов ( PK) соответствующих записей cartItem. Это будет на уровне приложения, что вам нужно будет проанализировать это и соответствующим образом расположить свои модели элементов. Большим плюсом для этого подхода будет в случае перетасовки порядка, в отдельных объектах может не быть изменений, но поскольку порядок сохраняется в виде поля индекса внутри строк таблицы элементов заказа, вам нужно будет выполнить команду обновления для каждой из строки, обновляющие свое поле индекса. Пожалуйста, дайте мне знать ваши критические замечания по поводу этого подхода, мне любопытно узнать, как это может потерпеть неудачу.

1
ответ дан 24 November 2019 в 14:16
поделиться

Предположим, что вам нужны сеансы на основе базы данных (Django также предлагает сеансы на основе файлов и на основе кэша):

  1. Откройте settings.py и найдите MIDDLEWARE _ CLASSES . Добавьте в список 'django.contrib.sessions.middleware.SessionMiddleware' .
  2. Найдите INSTALLED _ APPS в том же файле и добавьте туда 'django.contrib.sessions' .
  3. Запустите manage.py syncdb из командной строки.

После начальной настройки можно использовать request.session в своих представлениях для хранения информации между запросами.

Например, здесь хранится информация:

request.session['name'] = 'Ludwik'

, которую можно легко получить:

print request.session['name']

или

if request.session['name'] == 'Ludwik':
   print 'you are awesome!'

. Для получения других сведений об объекте request.session см. документацию .

-121--2599148-

Если диапазон индекса разбивается на неперекрывающиеся диапазоны, как вы предлагали, то при условии, что массив создается в общей памяти (т.е. не каждым потоком), блокировки не требуются.

-121--4746196-

Как насчет использования реализации связанного списка? В одном столбце будет содержаться значение (номер заказа) следующего предмета. Я думаю, что это намного проще всего использовать при вставке заказов между ними. Не нужно перенумеровать.

10
ответ дан 24 November 2019 в 14:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: