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





Вместо того, чтобы создавать пронумерованный столбец, как вы сказали, создайте поле, названное чем-то вроде родителя. Каждая строка содержит pk своего родительского элемента. Если вы хотите переместить один элемент вниз, просто измените его родительский pk на новый и элементы, которые ссылаются на него в их родительском pk. Подумайте о односвязных списках.
Я полагаю, что-то вроде связанного списка?
Мне нравится этот :) Однако db не защитит вашу «цепочку» задач. Если приложение разрывает ссылку, БД все равно, и ваша система сломается. хе-хе. DBList: P
вот и все. К сожалению, более сложный, чем прямой порядок, но он решает проблему возможности перемещать элементы без повторения всего списка.
Но как бы вы заказали это в инструкции Select
Артур, ты прав насчет того, что БД не защищает его. Я должен сказать, что я из школы, которая считает, что люди, модифицирующие систему, должны иметь возможность программировать, так сказать, без страховки.
Колин о заказе: с моей головы вы, возможно, не сможете. Возможно, вам придется заказать это в коде, но я не эксперт по sql, поэтому может быть способ сделать это, и он не приходит в голову. Я знаю, к чему спросить :)
о, я согласен, Кевин, ха-ха, но мне нравится думать о способах построения собственных сетей, когда я вижу проблему. Я бы, вероятно, написал для этого процедуру повторного связывания, чтобы приложения не выполняли эту задачу.
Таким образом не обеспечивается уникальность. Если у задачи 3 уже есть задача 2 в качестве родительской, и вы хотите пометить задачу 5 с задачей 2 в качестве родительской, теперь у задачи 2 есть два дочерних элемента. Вы будете вынуждены сначала поместить задачу 3 в задачу 5, но затем вам нужно будет изменить задачу 6 ...
Эй, Артур, я не имел в виду ничего неуважительного. Думаю, мне немного обидно вести дискуссии с программистами, и их главный ответ заключается в том, что система не делает все за меня, поэтому я не хочу использовать это решение :)
Я не видел неуважения. Я верю в ответственность :) Я люблю вещи, связанные с базами данных, и люблю думать о том, как защитить данные и убедиться, что они имеют смысл.
Я бы назначил только небольшое количество значений (1..10), а затем ORDER BY Priority DESC, DateCreated ASC. Если вам нужно иметь разные приоритеты для каждой задачи, вам нужно ОБНОВИТЬ WHERE Priority> xxx, как вы сказали.
Если никакие две задачи не могут иметь одинаковый приоритет, я думаю, это то, что вам нужно сделать. Но вы можете иметь приоритет и столбец с измененной датой и просто отсортировать по обоим, чтобы получить правильный порядок на основе приоритета и последнего обновления, если вы разрешите дублирование приоритета.
Используйте в качестве приоритета действительное числовое значение. Вы всегда можете перемещать значение между двумя существующими значениями с помощью чего-то вроде newPri = task1Pri + (task2Pri - task1Pri)/2, где Task1 имеет числовое значение с более низким приоритетом (что, вероятно, является более высоким приоритетом).
Корин указывает, что минимальный и максимальный приоритеты должны быть рассчитаны для задач, вставленных вверху или внизу списка приоритетов.
И Джоэлхарди напоминает нам, что процесс Изменение порядка - хорошая идея, чтобы время от времени очищать таблицу.
Это интересная идея. Я должен это запомнить.
Это хорошая идея, хотя я не уверен, что она очень практичная. Поскольку это также сделало бы вставки сложными. т.е. после первой записи становится ли следующий приоритет вставки MAX (realNumber)? Если да, то что произойдет, если вы вставите другое значение с более низким приоритетом.
Спасибо! (Теперь мне плохо - ха-ха) Я полагаю, что у вас все еще могут закончиться значения, хотя я не останавливался, чтобы выяснить предел. На самом деле мне тоже нравится ответ Скливца.
Корин - Я не думал добавлять задачу в конец списка :)
Поразмыслив, я бы сделал последнюю задачу чем-то вроде Max (existing) + 1 (or 2, or 5). Но не слишком высоко.
Это то, что я делаю, если мне не нужен auto_increment для новых задач, затем я использую решение kogus и auto_increment int на 100 или 1000 (а затем пишу cronjob, который проверяет «небольшие» промежутки между элементами - результат лоты перемещаемых элементов вокруг - чтобы указать на необходимость операции «переупорядочить все»).
Мне больше всего нравится ответ Кевина, но если вам нужно быстрое и грязное решение, просто сделайте это так, как вы уже описали, но вместо увеличения на 1, увеличивайте на 10 или 100 ... таким образом, если вам нужно измените приоритеты, у вас есть некоторое пространство для маневра между задачами.
Вы говорите, что никакие две задачи не могут иметь одинаковый уровень приоритета?