Приоритетный порядок SQL Server

У меня есть таблица, содержащая задачи, и я хочу дать им явный порядок в зависимости от приоритета задачи. Единственный способ, которым я могу это сделать, - использовать столбец уникальный int, который индексирует, где находится задача с точки зрения приоритета (т.е. 1 - это верхняя 1000 - низкая).

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

Может ли кто-нибудь предложить лучший способ реализации этого?

Вы говорите, что никакие две задачи не могут иметь одинаковый уровень приоритета?

Arthur Thomas 22.09.2008 03:34

нет значение приоритета уникально.

Corin Blaikie 22.09.2008 03:39
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
2
2 168
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

Я полагаю, что-то вроде связанного списка?

Corin Blaikie 22.09.2008 03:40

Мне нравится этот :) Однако db не защитит вашу «цепочку» задач. Если приложение разрывает ссылку, БД все равно, и ваша система сломается. хе-хе. DBList: P

Arthur Thomas 22.09.2008 03:41

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

kemiller2002 22.09.2008 03:42

Но как бы вы заказали это в инструкции Select

Corin Blaikie 22.09.2008 03:42

Артур, ты прав насчет того, что БД не защищает его. Я должен сказать, что я из школы, которая считает, что люди, модифицирующие систему, должны иметь возможность программировать, так сказать, без страховки.

kemiller2002 22.09.2008 03:44

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

kemiller2002 22.09.2008 03:45

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

Arthur Thomas 22.09.2008 03:49

Таким образом не обеспечивается уникальность. Если у задачи 3 уже есть задача 2 в качестве родительской, и вы хотите пометить задачу 5 с задачей 2 в качестве родительской, теперь у задачи 2 есть два дочерних элемента. Вы будете вынуждены сначала поместить задачу 3 в задачу 5, но затем вам нужно будет изменить задачу 6 ...

Doug L. 22.09.2008 03:50

Эй, Артур, я не имел в виду ничего неуважительного. Думаю, мне немного обидно вести дискуссии с программистами, и их главный ответ заключается в том, что система не делает все за меня, поэтому я не хочу использовать это решение :)

kemiller2002 22.09.2008 04:17

Я не видел неуважения. Я верю в ответственность :) Я люблю вещи, связанные с базами данных, и люблю думать о том, как защитить данные и убедиться, что они имеют смысл.

Arthur Thomas 22.09.2008 04:24

Я бы назначил только небольшое количество значений (1..10), а затем ORDER BY Priority DESC, DateCreated ASC. Если вам нужно иметь разные приоритеты для каждой задачи, вам нужно ОБНОВИТЬ WHERE Priority> xxx, как вы сказали.

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

Ответ принят как подходящий

Используйте в качестве приоритета действительное числовое значение. Вы всегда можете перемещать значение между двумя существующими значениями с помощью чего-то вроде newPri = task1Pri + (task2Pri - task1Pri)/2, где Task1 имеет числовое значение с более низким приоритетом (что, вероятно, является более высоким приоритетом).

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

И Джоэлхарди напоминает нам, что процесс Изменение порядка - хорошая идея, чтобы время от времени очищать таблицу.

Это интересная идея. Я должен это запомнить.

kemiller2002 22.09.2008 03:49

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

Corin Blaikie 22.09.2008 03:53

Спасибо! (Теперь мне плохо - ха-ха) Я полагаю, что у вас все еще могут закончиться значения, хотя я не останавливался, чтобы выяснить предел. На самом деле мне тоже нравится ответ Скливца.

Doug L. 22.09.2008 03:54

Корин - Я не думал добавлять задачу в конец списка :)

Doug L. 22.09.2008 03:55

Поразмыслив, я бы сделал последнюю задачу чем-то вроде Max (existing) + 1 (or 2, or 5). Но не слишком высоко.

Doug L. 22.09.2008 03:57

Это то, что я делаю, если мне не нужен auto_increment для новых задач, затем я использую решение kogus и auto_increment int на 100 или 1000 (а затем пишу cronjob, который проверяет «небольшие» промежутки между элементами - результат лоты перемещаемых элементов вокруг - чтобы указать на необходимость операции «переупорядочить все»).

joelhardi 22.09.2008 04:09

Мне больше всего нравится ответ Кевина, но если вам нужно быстрое и грязное решение, просто сделайте это так, как вы уже описали, но вместо увеличения на 1, увеличивайте на 10 или 100 ... таким образом, если вам нужно измените приоритеты, у вас есть некоторое пространство для маневра между задачами.

Другие вопросы по теме