Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Организация непрерывных списков. Или организации очереди? / 15 сообщений из 15, страница 1 из 1
30.07.2004, 16:42
    #32629895
mv
mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация непрерывных списков. Или организации очереди?
Пожалуй, действительно, мне в эту ветку...

Дано:

- набор записей (ну, например, записи о заказах - табличка ORDERS), в записи есть поле - Priority - приоритет. Integer. Nullable.

Требуется:

- при изменении значения Priority последовательность значений должна изменятьс так, чтобы получалась цепочка из значений от 1 до N. То же самое - при удалении, обNULL-ении и при вводе значений <=0 или > Count(*) where Priority is not nill

Например, был набор записей:

Код: plaintext
1.
2.
3.
4.
5.
6.
Id Priority Name

1  1        Первый
2  2        Второй
3  Null     Третий
4  3        Четвертый
5  Null     Пятый



Меняем значение Priority 3-й записи с Null на 2. Должно получиться:


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Id Priority Name

1  1        Первый
2  3        Второй
3  2        Третий
4  4        Четвертый
5  Null     Пятый
 


Как бы лучше реализовать?

сервер БД - FIREBIRD 1.5
...
Рейтинг: 0 / 0
30.07.2004, 16:50
    #32629914
Alexander Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация непрерывных списков. Или организации очереди?
Может лучше ставить время и дату а потом сортировать у кого дата свежее тот всегда будет первым
...
Рейтинг: 0 / 0
30.07.2004, 16:57
    #32629926
mv
mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация непрерывных списков. Или организации очереди?
Ну, можно, конечно. Не обязательно Integer. Важна возможность организации непрерывного списка и особенно - манипуляция позицией в очереди.
...
Рейтинг: 0 / 0
30.07.2004, 17:15
    #32629967
Alexander Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация непрерывных списков. Или организации очереди?
А нужно например передвигать очередь тоесть тот кто был к примеру 100 сделать его 50-м ???
...
Рейтинг: 0 / 0
30.07.2004, 17:19
    #32629979
mv
mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация непрерывных списков. Или организации очереди?
Да, нужно. См. пример в 1-м посте.
...
Рейтинг: 0 / 0
30.07.2004, 18:17
    #32630095
Old Nick
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация непрерывных списков. Или организации очереди?
перед изменением значения нужно сделать апдейт всех значений увеличивая их на единицу, начиная с данного числа

declare @N int
select @N = 2
update orders
set Priority = Priority + 1
where Priority >= @N

update orders
set Priority = @N
where id = @id
...
Рейтинг: 0 / 0
01.08.2004, 13:48
    #32630607
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация непрерывных списков. Или организации очереди?
Код: plaintext
1.
2.
3.
4.
5.
6.
Id PrevId Name

1  0      Первый
2  1      Второй
3  Null   Третий
4  2      Четвертый
5  Null   Пятый

Выборка упороядоченной очереди: с помощью иерархического запоса типа SELECT ... START WITH ... CONNECT BY ...

Добавление в середину очереди: UPDATE ... SET PrevId=2 WHERE id=3; UPDATE ... SET PrevId=3 WHERE id=4

Удаление из середины очереди: UPDATE ... SET PrevId=NULL WHERE id=2; UPDATE ... SET PrevId=1 WHERE id=4

P.S.: "А нужно например передвигать очередь тоесть тот кто был к примеру 100 сделать его 50-м ???" Это сводится к последовательности операций удаления из середины очереди и добавления в середину очереди.
...
Рейтинг: 0 / 0
02.08.2004, 14:13
    #32631461
mv
mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация непрерывных списков. Или организации очереди?
2 LeXa NalBat

Что???

Код: plaintext
1.
2.
3.
 SELECT ... START WITH ... CONNECT BY ...

...



- и это все можно делать в FB 1.5 ???
...
Рейтинг: 0 / 0
03.08.2004, 09:29
    #32632429
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация непрерывных списков. Или организации очереди?
SELECT ... START WITH ... CONNECT BY ... - и это все можно делать в FB 1.5 ???

Я не сталкивался с FB. Предложил этот путь, предполагая что, возможно, там можно это так или иначе реализовать.

В оракле это есть. В постгресе а) есть патч для иерархических запросов; или б) можно написать свою pl/pgsql функцию для этого.
...
Рейтинг: 0 / 0
03.08.2004, 13:22
    #32633192
mv
mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация непрерывных списков. Или организации очереди?
Сдается мне, что этот не "иерархический" запрос. Или я не правильно понимаю терминологию.
...
Рейтинг: 0 / 0
03.08.2004, 14:13
    #32633367
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация непрерывных списков. Или организации очереди?
Вроде бы это и называют иерархическим запросом.

http://gppl.moonbone.ru/README.html : "This is a patch which allows PgSQL to make hierarchical queries a la Oracle do".
...
Рейтинг: 0 / 0
03.08.2004, 14:16
    #32633383
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация непрерывных списков. Или организации очереди?
Да, ваш случай - стек, мне кажется, можно рассматривать как частный случай дерева.
...
Рейтинг: 0 / 0
03.08.2004, 15:08
    #32633522
mv
mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация непрерывных списков. Или организации очереди?
У меня НЕТ ссылок на предыдущие элементы списка. Так как при отсутствии "иерархических" запросов пришлось бы создавать рекурсивную ХП. У меня просто подмножество записей упорядочено по одному из полей, с непрерывной нумерацией в заданном диапазоне (открытом с одной сторой).
...
Рейтинг: 0 / 0
03.08.2004, 15:48
    #32633653
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация непрерывных списков. Или организации очереди?
У меня НЕТ ссылок на предыдущие элементы списка. У меня просто подмножество записей упорядочено по одному из полей, с непрерывной нумерацией в заданном диапазоне (открытом с одной сторой).

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

В таком случае видимо остается довольствоваться вариантом, который предложил Old Nick. Подумайте об эффективности узкого места в этом алгоритме: "нужно сделать апдейт всех значений увеличивая их на единицу".

В лагоритме с иерархическими запросами узким местом, конечно же, является "select ..." - оцените его эффективность при реализации через рекурсивную ХП в FB. И - выбирайте. :)

"Рекурсивная ХП" - это функция вызывающая сама себя? В постгресе я сделал иначе - LOOP внутри ХП. Может быть аналогично можно сделать в FB?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create or replace function arid_prids(integer) returns setof integer as '
DECLARE
  myarid integer;
BEGIN
  myarid := $1;
  LOOP
    RETURN NEXT myarid;
    SELECT INTO myarid prid from pr_areas where arid = myarid;
    IF myarid = 0 OR NOT FOUND THEN
       EXIT;
    END IF;
  END LOOP;
  RETURN;
END;
' LANGUAGE 'plpgsql';
...
Рейтинг: 0 / 0
04.08.2004, 10:26
    #32634439
Вася
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация непрерывных списков. Или организации очереди?
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Организация непрерывных списков. Или организации очереди? / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]