|
|
|
Система приоритетов
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток, всезнающий Олл! Помогите с простой задачкой, никак не могу придумать стоящее решение. Все просто: каталог есть айтемов, нужно создать систему приоритетов для них на уровне БД. То есть табличка из трех полей: id, item, prior. Первое что приходит в голову это ORDER BY prior, где prior уникальное. Но как тогда заставить все это вставить запись в середину таблицы и при этом не перешерстить половину записей? Заранее благодарен! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2007, 17:27 |
|
||
|
Система приоритетов
|
|||
|---|---|---|---|
|
#18+
Какое СУБД Вы используете? Для большинства СУБД нет понятия "середина/начало/конец таблицы" (таблица - множество записей). Т.е. при вставке записи никто/ничто не будет "шерстить половину записей" (структура индексов - древовидная, глубина примерно одинакова для всех записей). Осмысленным может быть, например, "середина/начало/конец выборки с таким-то ORDER BY..." ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2007, 17:50 |
|
||
|
Система приоритетов
|
|||
|---|---|---|---|
|
#18+
mephПервое что приходит в голову это ORDER BY prior, где prior уникальное. Или проблема в другом? в том, что при одинаковых значениях prior теряется однозначность? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2007, 17:54 |
|
||
|
Система приоритетов
|
|||
|---|---|---|---|
|
#18+
В данном случае конкретизировать СУБД нет смысла. Возможно Вы неправильно меня поняли. Под емким понятием "шерстить" я имел в виду тот факт, что, возможно, прийдется изменять поле prior в половине строк таблицы. Как избежать этого? Какой использовать алгоритм для поля prior, чтобы затрачивать как можно меньше обращений к базе? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2007, 17:57 |
|
||
|
Система приоритетов
|
|||
|---|---|---|---|
|
#18+
LRИли проблема в другом? в том, что при одинаковых значениях prior теряется однозначность? Естественно, что prior должно быть уникально для однозначного формирования упорядоченного списка ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2007, 18:00 |
|
||
|
Система приоритетов
|
|||
|---|---|---|---|
|
#18+
> нужно создать систему приоритетов для них на уровне БД Задачу полностью сформулируйте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2007, 18:20 |
|
||
|
Система приоритетов
|
|||
|---|---|---|---|
|
#18+
Навскидку, пошел бы путем разрешения коллизии одинаковых значений prior - добавил бы еще одно поле (с автоматически генерируемым значением при вставке а возможно и обновлении - identity или timestamp или просто дата-время или другое но такое, чтобы пара значений prior + еще_одно_поле было уникальным), которое бы и использовал в ORDER BY prior, еще_одно_поле asc|desc ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2007, 18:21 |
|
||
|
Система приоритетов
|
|||
|---|---|---|---|
|
#18+
Можно уточнить? Имеется ввиду, что нужно хранить в базе упорядоченный список с поддержкой операций - Вставить после - Вставить до с указанием элемента. Конкретные значения prior не важны. Приоритет должен быть уникальным. Сразу вопрос: как вы будете использовать значение приоритета? Вым нужен будет порядковый номер элемента в списке. Или только ответ на вопрос, какой элемент приоритетней? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2007, 18:23 |
|
||
|
Система приоритетов
|
|||
|---|---|---|---|
|
#18+
Пояснию, что хотел сказать автор топика: Есть таблица Строка Приоритет 1 1 2 2 3 3 4 4 5 5 А теперь добавим строку между 2 и 3, какое значение указать? 2 или 3 или 2,5? Самый простой способ это проапдейтить поле Приоритет увеличив его на единицу в тех строках, где приоритет более 2, т.е. 3 строки (больше половины всех записей) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2007, 18:27 |
|
||
|
Система приоритетов
|
|||
|---|---|---|---|
|
#18+
?Можно уточнить? Имеется ввиду, что нужно хранить в базе упорядоченный список с поддержкой операций - Вставить после - Вставить до с указанием элемента. Конкретные значения prior не важны. Приоритет должен быть уникальным. Сразу вопрос: как вы будете использовать значение приоритета? Вым нужен будет порядковый номер элемента в списке. Или только ответ на вопрос, какой элемент приоритетней? нужна одна операция всего лишь: выборка и вывод элементво по приоритету. Думаю, что если это реализовать, то остальное будет не проблема ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2007, 18:45 |
|
||
|
Система приоритетов
|
|||
|---|---|---|---|
|
#18+
Old NickПояснию, что хотел сказать автор топика: Есть таблица Строка Приоритет 1 1 2 2 3 3 4 4 5 5 А теперь добавим строку между 2 и 3, какое значение указать? 2 или 3 или 2,5? Самый простой способ это проапдейтить поле Приоритет увеличив его на единицу в тех строках, где приоритет более 2, т.е. 3 строки (больше половины всех записей) Идея правильная у Вас, но боюсь, что реализация такая неуместна. Как Вы сами видите, Ваш вариант не работает. Конечно же апдейтить все поля с большим/меньшим приоритетом при добавлении одного лишь элемента это не выход. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2007, 18:48 |
|
||
|
Система приоритетов
|
|||
|---|---|---|---|
|
#18+
Example Prvaja zapis' vstavljaetsja s prioritetom ravnym polovine maximal'nogo znachenija polja, naprimer pust' max znachenie dlja Priority budet 2 000 000 000 togda Item_ID,Priority 0,1 000 000 000 1.Dobavljaem zapis' s prioritetom bol'she chem u Item_ID(0). Priority= Item_ID(0).Priority+(Max.znachenie polja- Item_ID(0).Priority)/2 t.e Item_ID(1).Priority = 1 000 000 000 + (2 000 000 000 - 1 000 000 000)/2 = 1 500 000 000 2.Dobavljaem zapis' s prioritetom bol'she Item_ID(0) , no men'she Item_ID(1). Nahodim naibol'shee znachenie Priority mezhdu zadannymi granicami. V nashem sluche eto budet 1 000 000 000 . t.e Item_ID(2).Priority = 1 000 000 000 + (1 500 000 000 - 1 000 000 000)/2 = 1 250 000 000 Nu i tak dalee. U etogo podhoda ets' ochevidnye ogranichenija, no on prost v realizacii. Izvinite za sumburnoe objasnenie. S Novym Godom. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2007, 18:53 |
|
||
|
Система приоритетов
|
|||
|---|---|---|---|
|
#18+
Я привел не решение, а пояснил вопрос автора топика. Я такое решение использую, но только когда колчиество записей на экран входит А вообще с проблемой автора топика я не сталкивался, видимо криво не проектировал ещё ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2007, 18:55 |
|
||
|
Система приоритетов
|
|||
|---|---|---|---|
|
#18+
www.dkoh.netExample Prvaja zapis' vstavljaetsja s prioritetom ravnym polovine maximal'nogo znachenija polja ... S Novym Godom. Такой вариант был рассмотрен давно, но в несколько иной интерпритации: просто делать равные промежутки между записямии перемещать записи в пределах этих промежутков. Но Вы сами понимаете, что этот метод будет работать до некоторого момента, пока все не завалится окончательно. Да и об отимальности тут говорить не приходится...Спасибо за вариант, ждем еще предложений. Вас также с наступившим! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2007, 19:27 |
|
||
|
Система приоритетов
|
|||
|---|---|---|---|
|
#18+
Old NickА вообще с проблемой автора топика я не сталкивался, видимо криво не проектировал ещё Спасибо за участие, но зачем же обижаться? И где тут кривизна проетирования? Это тривиальная задача: вывести записи в определенном порядке, а не подряд :) Ну и некоторый механизм регулирования этого порядка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2007, 19:31 |
|
||
|
Система приоритетов
|
|||
|---|---|---|---|
|
#18+
Old NickА теперь добавим строку между 2 и 3, какое значение указать? 2 или 3 или 2,5? вариант 2,5 www.dkoh.netU etogo podhoda ets' ochevidnye ogranichenija, no on prost v realizacii. его можно слегка переиначить(технически) - сделать поле prior строковым типом, и тогда между "2" и "3" указывать "29", между "2" и "29" - "28", а между "29" и "3" - "299" и т.д., т.е. к "строке сверху" добавляем символ - максимальный из возможных в данном месте для сортировки. Сортировка по строковому типу даст нужный порядок. В таком случае ограничение останется только на размер строкового поля. Ряд символов конечно же целесообразно расширить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2007, 19:48 |
|
||
|
Система приоритетов
|
|||
|---|---|---|---|
|
#18+
> И где тут кривизна проетирования? В неестественности задачи. Очень напоминает удаление гланд через задний проход. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2007, 19:52 |
|
||
|
Система приоритетов
|
|||
|---|---|---|---|
|
#18+
guest_20040621 wrote: > > И где тут кривизна проетирования? > > В неестественности задачи. Очень напоминает удаление гланд через задний > проход. Очень напоминает user defined sorting ну нравится юзверю, чтобы после "промокашки" в каталоге были "букашки", а потом решил он между "промокашками" и "букашками" вставить "арбузики"... А потом решил пересортировать.... Чего бы и нет? Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2007, 20:40 |
|
||
|
Система приоритетов
|
|||
|---|---|---|---|
|
#18+
Сколько миллионов записей предполагается в каталоге? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2007, 20:53 |
|
||
|
Система приоритетов
|
|||
|---|---|---|---|
|
#18+
> Чего бы и нет? Ну потому что глупость невероятная. Экзотическую сортировку если и делать, то используя правила, а не уникальные последовательности. Как справедливо заметил Old Nick, нафиг не упиралось такое ранжирование для количества элементов большего, чем умещается на одном экране. Не очевидно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2007, 21:09 |
|
||
|
Система приоритетов
|
|||
|---|---|---|---|
|
#18+
guest_20040621 Ну потому что глупость невероятная. Экзотическую сортировку если и делать, то используя правила, а не уникальные последовательности. я так полагаю, что не от хорошой жизни и не программеры эту систему приоритетов придумали, а заказчику она понадобилась. т.е., вероятно, это не косяк проектировки, а требования заказчика. тем более, что ни вы, ни я этого проекта целиком не видели. guest_20040621 Как справедливо заметил Old Nick, нафиг не упиралось такое ранжирование для количества элементов большего, чем умещается на одном экране. Мне, предположим, вообще не понятно, почему именно ограничение размером экрана? и почему от этого должно быть легче - система приоритетов все равно одна должна быть, а не на каждый экран своя. а если надо в список в файл вывести, например? P.S. а какова табличка по размеру? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2007, 00:56 |
|
||
|
Система приоритетов
|
|||
|---|---|---|---|
|
#18+
guest_20040621> И где тут кривизна проетирования? В неестественности задачи. Очень напоминает удаление гланд через задний проход. задача то естественна, весь Activity Management пестрит такими задачами :) Все в строго заданном порядке, никаких сортировок по условиям и т.п. meph, все способы имеют свои ограничения. Мы пересчитываем. Правда работаем с иерархическими структурами и пересчитывается только один уровень. Для больших линейных списков это конечно не выход. Но к сож. в рсубд записи - куча, а не упорядоченный список. На объектных субд было получше в этом плане. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2007, 10:49 |
|
||
|
Система приоритетов
|
|||
|---|---|---|---|
|
#18+
Табличка небольшая будет - тысяч на десять, но так как использовать этот механизм предпологается в разных проектах, то возможно и до 100 000 дотянет. Все же 50 000 апдейтов делать не очень хочется. Хотелось бы сделать, так чтобы потом система не легла в один прекрасный момент. Для тех кому слишком интересно зачем такое понадобилось, самый просто пример: каталог товаров, где владелец может некоторые товары выводить в начале. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2007, 12:48 |
|
||
|
Система приоритетов
|
|||
|---|---|---|---|
|
#18+
mephкаталог товаров, где владелец может некоторые товары выводить в начале. мы присваиваем в подобных случаях товару категорию (типа ABC).. порядок внутри категории в этом случае не столь важен, главное чтобы товары А были вверху списка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2007, 13:25 |
|
||
|
Система приоритетов
|
|||
|---|---|---|---|
|
#18+
iscrafmмы присваиваем в подобных случаях товару категорию (типа ABC).. порядок внутри категории в этом случае не столь важен, главное чтобы товары А были вверху списка. Вот это уже ближе. Осталось только придумаьт такой механизм, который был бы применим для ВСЕХ товаров, а не для пары-тройки самых важных. Например, чтобы была возможность сегодня выводить колбасу за сыром, но перед рыбой, а завтра все в обратном порядке. з.ы. думаю все уже давно поняли, что требуется получить на выходе... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2007, 13:48 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=34238703&tid=1544799]: |
0ms |
get settings: |
5ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
154ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
79ms |
get tp. blocked users: |
1ms |
| others: | 206ms |
| total: | 469ms |

| 0 / 0 |
