Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / как изменить вектор целых? / 25 сообщений из 27, страница 1 из 2
10.12.2007, 16:27
    #34998822
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как изменить вектор целых?
т.е. есть поле типа вектор, в енм нужно заменить часть вектора, скажем так: в векторе сидит путь в дерерве к узлу и мне надо перевесить узел под другой парент.

Как быстрее всего апдейтнуть запись?
...
Рейтинг: 0 / 0
10.12.2007, 16:30
    #34998836
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как изменить вектор целых?
Winnipuhт.е. есть поле типа вектор, в енм нужно заменить часть вектора, скажем так: в векторе сидит путь в дерерве к узлу и мне надо перевесить узел под другой парент.

Как быстрее всего апдейтнуть запись?

ошибся, не вектор(!), а ARRAY
...
Рейтинг: 0 / 0
10.12.2007, 17:57
    #34999197
как изменить вектор целых?
Но если известен индекс изменяемого элемента, затруднений не должно возникнуть...
Код: plaintext
UPDATE test.table SET pay[ 4 ] =  15000   WHERE id=  10 ;
Или там какие-то дополнительные сложности? Индексы по какому-то хитрому алгоритму
определяются, или еще что-нибудь?
...
Рейтинг: 0 / 0
10.12.2007, 18:02
    #34999229
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как изменить вектор целых?
Золотая рыбкаНо если известен индекс изменяемого элемента, затруднений не должно возникнуть...
Код: plaintext
UPDATE test.table SET pay[ 4 ] =  15000   WHERE id=  10 ;
Или там какие-то дополнительные сложности? Индексы по какому-то хитрому алгоритму
определяются, или еще что-нибудь?

мне в общем случае надо менять:

подмассив с начала до какого-то элемента на другой подмассив, причем он может быть меньшей, такой же или большей длины, чем заменяемый
...
Рейтинг: 0 / 0
10.12.2007, 18:18
    #34999278
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как изменить вектор целых?
пример:


Код: plaintext
1.
2.
3.
4.
5.
6.
CREATE TABLE tic (id int, v integer[ 3 ]);

insert into tic(id, v) values( 1 , '{1,2,3,4,5,6}');
insert into tic(id, v) values( 2 , '{1,2,3,7,8,9}');
insert into tic(id, v) values( 3 , '{1,2,3,4,10,11}');

select * from tic

2;"{1,2,3,7,8,9}"
3;"{1,2,3,4,10,11}"
1;"{1,2,3,4,5,6}"

заменить для id=1 и 3: заменить 1,2,3,4 на 1,2,3,7,8, т.е. перевесить поддерево к другому паренту

как такое сделать эфективно?
...
Рейтинг: 0 / 0
10.12.2007, 19:14
    #34999394
как изменить вектор целых?
> в векторе сидит путь в дерерве к узлу и мне надо перевесить узел под другой парент

Сложно придумать что-то более тупое.
...
Рейтинг: 0 / 0
10.12.2007, 19:24
    #34999410
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как изменить вектор целых?
PostreSQL начинающий> в векторе сидит путь в дерерве к узлу и мне надо перевесить узел под другой парент

Сложно придумать что-то более тупое.

что именно по вашему мнению "тупое"?
...
Рейтинг: 0 / 0
10.12.2007, 19:40
    #34999434
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как изменить вектор целых?
PostreSQL начинающий> в векторе сидит путь в дерерве к узлу и мне надо перевесить узел под другой парент

Сложно придумать что-то более тупое.

где же вы, добрый, смелый и знающий человек?
...
Рейтинг: 0 / 0
10.12.2007, 21:24
    #34999575
как изменить вектор целых?
> что именно по вашему мнению "тупое"?

"в векторе сидит путь в дерерве к узлу"
...
Рейтинг: 0 / 0
11.12.2007, 04:27
    #34999822
Ёш
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как изменить вектор целых?
как то так:
Код: plaintext
1.
2.
3.
4.
seb=> select id, a, '{1,2,3,7,8}'::int[] || a[ 5 :array_upper(a,  1 )] from (select  1  as id, array[ 1 , 2 , 3 , 4 , 10 , 11 ] as a) as foo;
 id |        a        |     ?column?
----+-----------------+-------------------
   1  | { 1 , 2 , 3 , 4 , 10 , 11 } | { 1 , 2 , 3 , 7 , 8 , 10 , 11 }
правда незнаю насколько это эффективно и как вообще сделать по другому...


--
„Истина — это вовсе не то, что можно убедительно доказать, это то, что
делает всё проще и понятнее“ — Антуан де Сент-Экзюпери
...
Рейтинг: 0 / 0
11.12.2007, 08:59
    #34999989
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как изменить вектор целых?
PostreSQL начинающий> что именно по вашему мнению "тупое"?

"в векторе сидит путь в дерерве к узлу"

"не останавливайтесь же", что вы можете предложить?
...
Рейтинг: 0 / 0
11.12.2007, 10:03
    #35000120
как изменить вектор целых?
> что вы можете предложить?

Вам - ничего. Для начала прочтите хоть что-нибудь по теме. Хотя бы из разряда "базы данных для dummies за 15 минут".
...
Рейтинг: 0 / 0
11.12.2007, 10:08
    #35000127
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как изменить вектор целых?
PostreSQL начинающий> что вы можете предложить?

Вам - ничего. Для начала прочтите хоть что-нибудь по теме. Хотя бы из разряда "базы данных для dummies за 15 минут".

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

Вы на какой странице "базы данных для dummies за 15 минут"?
...
Рейтинг: 0 / 0
11.12.2007, 10:47
    #35000274
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как изменить вектор целых?
Winnipuhчто вы можете предложить?хранить дерево в виде (id, parent_id)
...
Рейтинг: 0 / 0
11.12.2007, 11:18
    #35000419
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как изменить вектор целых?
LeXa NalBat Winnipuhчто вы можете предложить?хранить дерево в виде (id, parent_id)

из-за специфики задачи я ушел от такого хранения, надо быстро искать, потому держу в записи путь
...
Рейтинг: 0 / 0
11.12.2007, 11:37
    #35000492
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как изменить вектор целых?
Winnipuh LeXa NalBatхранить дерево в виде (id, parent_id)из-за специфики задачи я ушел от такого хранения, надо быстро искать, потому держу в записи путьвыигрываете в одном, проигрываете в другом. может все-таки выбрать другой способ хранения... "надо быстро искать" - какие выборки нужны?
...
Рейтинг: 0 / 0
11.12.2007, 11:53
    #35000554
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как изменить вектор целых?
LeXa NalBat Winnipuh LeXa NalBatхранить дерево в виде (id, parent_id)из-за специфики задачи я ушел от такого хранения, надо быстро искать, потому держу в записи путьвыигрываете в одном, проигрываете в другом. может все-таки выбрать другой способ хранения... "надо быстро искать" - какие выборки нужны?

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

Если сделать "по теории", т.е. основная таблица узлов+подчиненная с путями, то получается
в мастер 50 млн записей, в подчиненной может быть до 20 уровней дерева, т.е. больше 250 млн.
...
Рейтинг: 0 / 0
11.12.2007, 12:14
    #35000634
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как изменить вектор целых?
Winnipuhдял поиска используется полнотекстовый поиск по основному полю и плюс уточняется расположение узла в дереве.
База предназанчена для поиска, но нужно перевешивать узлы, удалять, добавлять.

Если сделать "по теории", т.е. основная таблица узлов+подчиненная с путями, то получается
в мастер 50 млн записей, в подчиненной может быть до 20 уровней дерева, т.е. больше 250 млн.допустим такая структура

полнотекстовый индекс по полю search

id, parent_id, name, search
--
1, null, 'всё', null
2, 1, 'компьютеры', 'компьютер computer' -- по нелистовым узлам надо искать? у них может быть поле search не null?
3, 2, 'ноутбуки', 'ноутбук notebook'
4, 2, 'десктопы', 'десктоп desktop'
5, 1, 'телефоны', 'телефон, мобильник, сотовый, phone, mobile'

с какими ограничениями надо искать? только по полю search?

каков должен быть результат? показывать все найденные элементы и их предков в виде дерева?
...
Рейтинг: 0 / 0
11.12.2007, 12:48
    #35000796
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как изменить вектор целых?
LeXa NalBat Winnipuhдял поиска используется полнотекстовый поиск по основному полю и плюс уточняется расположение узла в дереве.
База предназанчена для поиска, но нужно перевешивать узлы, удалять, добавлять.

Если сделать "по теории", т.е. основная таблица узлов+подчиненная с путями, то получается
в мастер 50 млн записей, в подчиненной может быть до 20 уровней дерева, т.е. больше 250 млн.допустим такая структура

полнотекстовый индекс по полю search

id, parent_id, name, search, path
--
1, null, 'всё', null
2, 1, 'компьютеры', 'компьютер computer' -- по нелистовым узлам надо искать? у них может быть поле search не null?
3, 2, 'ноутбуки', 'ноутбук notebook'
4, 2, 'десктопы', 'десктоп desktop'
5, 1, 'телефоны', 'телефон, мобильник, сотовый, phone, mobile'

с какими ограничениями надо искать? только по полю search?

каков должен быть результат? показывать все найденные элементы и их предков в виде дерева?

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

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

select * from t where
string_vector @@ to_tsquery('default','polis & entire | antalya')
and
and '{"123722"}'::int[] <@ path_array::int[]
...
Рейтинг: 0 / 0
11.12.2007, 13:02
    #35000859
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как изменить вектор целых?
Winnipuhда предположим такой способ хранения дерева, нет доп. таблицы, где указаны все пути.

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

select * from t where
string_vector @@ to_tsquery('default','polis & entire | antalya')
and
and '{"123722"}'::int[] <@ path_array::int[]по какому плану, по вашему мнению, постгрес должен наиболее эффективно выполнить такой запрос?

поиск по полнотекстовому индексу (по всему дереву), и последующая фильтрация результатов по вхождению в поддерево?
...
Рейтинг: 0 / 0
11.12.2007, 13:09
    #35000879
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как изменить вектор целых?
LeXa NalBat Winnipuhда предположим такой способ хранения дерева, нет доп. таблицы, где указаны все пути.

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

select * from t where
string_vector @@ to_tsquery('default','polis & entire | antalya')
and
and '{"123722"}'::int[] <@ path_array::int[]по какому плану, по вашему мнению, постгрес должен наиболее эффективно выполнить такой запрос?

поиск по полнотекстовому индексу (по всему дереву), и последующая фильтрация результатов по вхождению в поддерево?

однозначно трудно сказать в каком случае оптимальнее, видимо так.
Наример, если юзер указывает узел близкий к корню, то под ним будет намного больше потомков, чем войдут в полнотектсовый критерий
...
Рейтинг: 0 / 0
11.12.2007, 13:45
    #35001013
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как изменить вектор целых?
Winnipuhоднозначно трудно сказать в каком случае оптимальнее, видимо так.
Наример, если юзер указывает узел близкий к корню, то под ним будет намного больше потомков, чем войдут в полнотектсовый критерийтогда создаете две plpgsql функции
bool tr_contains(parent_id int, id int) - является ли parent_id предком для id
setof int tr_subtree(parent_id int) - возвращает id всех потомков для данного parent_id

в зависимости от объема поддерева можете выбирать один из запросов
select * from ( select * from table where string_vector @@ to_tsquery('a') ) where tr_contains(123722,id) -- по полнотекстовому индексу
select * from ( select * from tr_subtree(123722) ) where string_vector @@ to_tsquery('a') -- без полнотекстового индекса
...
Рейтинг: 0 / 0
11.12.2007, 13:52
    #35001042
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как изменить вектор целых?
LeXa NalBat Winnipuhоднозначно трудно сказать в каком случае оптимальнее, видимо так.
Наример, если юзер указывает узел близкий к корню, то под ним будет намного больше потомков, чем войдут в полнотектсовый критерийтогда создаете две plpgsql функции
bool tr_contains(parent_id int, id int) - является ли parent_id предком для id
setof int tr_subtree(parent_id int) - возвращает id всех потомков для данного parent_id

в зависимости от объема поддерева можете выбирать один из запросов
select * from ( select * from table where string_vector @@ to_tsquery('a') ) where tr_contains(123722,id) -- по полнотекстовому индексу
select * from ( select * from tr_subtree(123722) ) where string_vector @@ to_tsquery('a') -- без полнотекстового индекса

ок, буду пробовать
...
Рейтинг: 0 / 0
11.12.2007, 17:23
    #35001987
domanix
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как изменить вектор целых?
Глянте на контриб модули
intarray и ltree
Может пригодится заявленная там функциональность?
...
Рейтинг: 0 / 0
11.12.2007, 18:26
    #35002301
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как изменить вектор целых?
domanixГлянте на контриб модули
intarray и ltree
Может пригодится заявленная там функциональность?

спасибо, посмотрю.
Они не включены в 8.3 ?
Если руками добавлять, то наверное под виндоуз проблематично будет.
Мне надо, чтобы под линуксом и под вин работало...
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / как изменить вектор целых? / 25 сообщений из 27, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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