@pgsql

Страница 316 из 1062
Mikhail
01.05.2017
09:15:26
К тому же, если все миллион пользователей будут онлайн. Тогда в каждой таблице буду создаваться подзапросы с numrow. В тоже время в случае с materialized view будет один сброс таблицы, зато миллион запросов пойдут через индексы

т.е. в случае партицированием мне кажется сложность алгоритма будет больше

я запутался, кто из них 8, кто 1))
1-ый - это первый день. 8-ой - 8 день, который уходит в мусор.

Google
Mikhail
01.05.2017
09:23:20
Ну его можно сделать конкурентным в начале минуты. Даже если не успеет за минуту, то просто возьмутся старые данные

Andrey
01.05.2017
10:22:48
Потому на уровне приложения уже находим строку с заданным userId и относительно неё отсчитываем 10 сверху и 10 снизу
Мы в PG Pro Enterprise сделали функцию поиска n ближайших соседей по индексу (KNN), но вот не могу сходу доку на неё найти. Завтра спрошу коллег

Mikhail
01.05.2017
10:23:40
Andrey
01.05.2017
10:24:55
Вот и замечательно

Darafei
01.05.2017
19:32:19


Sergey
01.05.2017
19:33:36


тогда лучше это)

nietzschebrod
01.05.2017
20:59:27


Денис
02.05.2017
11:19:04
подскажите такой вопрос создаю первую таблицу CREATE TABLE "settings" ( "id" SERIAL NOT NULL, "module" CHARACTER VARYING(30), "value" TEXT, CONSTRAINT "PRIMARY" PRIMARY KEY ("id") ); пытаюсь создать вторую CREATE TABLE "districts" ( "id" SERIAL NOT NULL, "title" CHARACTER VARYING(100), "visible" INT DEFAULT 1, CONSTRAINT "PRIMARY" PRIMARY KEY ("id") ); выдаёт вот такое ERROR: SQLSTATE[42P07]: Duplicate table: 7 ERROR: relation "PRIMARY" already exists

Anatoliy
02.05.2017
11:23:05
ну дык констрейнты назовите по разному

Denis
02.05.2017
11:23:11
Вы создали в первом выражении таблицу settings и индекс primary. Вторым выражением создаёте таблицу districts и опять индекс с названием primary. Вот на это и ругается постгрес, имена индексов должны быть уникальны

Anatoliy
02.05.2017
11:23:13
имя таблицы в имя констрейнта добавьте

Google
Andrey
02.05.2017
11:24:48
о так это ж круто и как работает?
В моем понимании- это поход по индексу "в бок", а не вверх и низ по дереву. Соответственно берем 10 соседей и результат готов.

Денис
02.05.2017
11:26:32
спасибо за ответ

Valeriy
02.05.2017
11:31:38
Всем привет! Прошу поделиться опытом как в бою добавляют поля в PK, на который другие FK ссылаются. Может статьи есть по теме хорошие?

Anatoliy
02.05.2017
11:35:24
Не улавливаю связи с FK, но вообще pkey пересоздается: ALTER TABLE table DROP CONSTRAINT table_pkey, ALTER TABLE table ADD PRIMARY KEY (new fields);

Но я бы выслушал кого-нибудь ещё, вдруг я ошибаюсь.

Связь уловил. Ну да, в случае если прошлое поле станет неуникальным

Если оно остается уникальным – можно добавить же unique индекс

Если поле станет неуникальным – вам придется создать "словарик" отдельно и вешать зависимости уже на него. Если останется – добавить unique на поле. Способов проще по-моему нету.

Valeriy
02.05.2017
11:43:58
Ситуация думаю что типовая, но я сейчас туплю. Попробовал в лоб дропнуть и создать PK, он мне вывалил 2BP01 dependent_objects_still_exist. На таблицу, в которой я пытаюсь поменять ключ ссылается другая. drop cascade и пересоздание индексов по всем ссылающимся делать не хочется. Быстрое гугление выдало грязный хак в виде отключения проверки целостности, что тоже в бой нельзя вываливать.

То есть задача добавить новое поле в таблицу, и добавить его в ключ, но связи мешают.

Mike Chuguniy
02.05.2017
11:46:48
А вам точно надо пересоздавать ПК? А уникальным ключом обойтись, если надо для ссылочной целостности, не хватит?

FOREIGN KEY - оно же совсем необязательно на ПК ссылаться должОн. Ему вполне себе уникальности достаточно.

Denis
02.05.2017
12:00:43
А зачем вам нужно добавлять в первичный ключ дополнительные поля? Нельзя ли просто добавить дополнительный индекс?

Valeriy
02.05.2017
12:10:21
по сути, мне надо делать новую таблицу-справочник, и загонять в неё новое поле, и связывать с родительской, чтобы оно было уникальным. Но в процессе возник интерес, а как это в продуктиве можно провернуть с ключами. Забыли, например ещё одно поле в составной PK добавить. И вот тут надо всё нафиг разбирать до крайнего потомка, ломать проверку целостности или как-то можно полегче вывернуться.

Anton [Mgn, az09@osm]
02.05.2017
12:13:21
"полегче" - проверять целостность в приложении, а не средствами субд (конечно нет)

Valeriy
02.05.2017
12:17:17
понятно, спс

Mike Chuguniy
02.05.2017
12:17:51
Полегче - это не плевать на этап проектирования БД при написании приложения, как это бывает в подавляющем большинстве случаев наличия подобных проблем. По-другому - никак. А проверять целостность на уровне приложения - а для зачем тогда СУБД?

Denis
02.05.2017
12:18:04
по сути, мне надо делать новую таблицу-справочник, и загонять в неё новое поле, и связывать с родительской, чтобы оно было уникальным. Но в процессе возник интерес, а как это в продуктиве можно провернуть с ключами. Забыли, например ещё одно поле в составной PK добавить. И вот тут надо всё нафиг разбирать до крайнего потомка, ломать проверку целостности или как-то можно полегче вывернуться.
Первичный ключ - это просто уникальный индекс на столбцы. Если он используется другими таблицами, то трогать его не надо, он вам все равно будет нужен. В описанной вами ситуации разумно просто добавить дополнительный индекс по расширенному перечню столбцов для ускорения

Valeriy
02.05.2017
12:19:18
спасибо!

Denis
02.05.2017
12:21:59
И разбирать в описанной вами ситуации ничего не надо. Как и новую таблицу создавать. Вообще, я рекомендую книжку Рефакторинг баз данных, эволюционное проектирование. В ней все уже украдено до нас и подробно разбираются паттерны как что добавлять и менять на продакшене

Google
Mike Chuguniy
02.05.2017
12:30:11
Для просто хранить данные вон файловой системы достаточно.

Denis
02.05.2017
12:30:33
Сейчас начнётся (взял попкорн)

Fike
02.05.2017
12:30:49
А я про что?
так я не тебе же этим комментарием отвечал

Mike Chuguniy
02.05.2017
12:31:59
Ну, звиняй, боярин, бес попутал. Однако.

Denis
02.05.2017
12:33:09
Разочаровано убрал попкорн, ложная тревога

Valeriy
02.05.2017
12:33:29
вбросить про акапитализм и waterfall vs agile?

Mike Chuguniy
02.05.2017
12:34:37
вбросить про акапитализм и waterfall vs agile?
А что значат эти страшные наглосакские термины?

Valeriy
02.05.2017
12:36:29
(методологии разработки ПО https://ru.wikipedia.org/wiki/Гибкая_методология_разработки/). ну то есть в современных условиях никто денег не даст нормально проектировать. Те, у кого деньги есть - уже всё напроектировали, и давят конкурентов ценами. Молодые да резвые не могут тратить нормально времени на проект, надо деплоить в продакшен. Вот такая грусть-печаль.

Denis
02.05.2017
12:41:47
Вы лучше про акапитализм поделитесь ссылкой, что за зверь такой диковинный да заморский?

Valeriy
02.05.2017
13:09:32
капитализм+дрожащиепальцы=акапитализм

вот вам по теме : https://www.youtube.com/watch?v=QJ58nCY6sPM&list=PLQCYG6lKBuTaJkaxbrdoZdGjFpTFwI-o0

Алексей
02.05.2017
13:12:11
Всем привет. Подскажите почему в запрос не подставляется имя передаваемое через параметр

create or REPLACE function temp.update_intid(count integer, count2 integer, nameTable CHARACTER VARYING(50)) returns void AS $$ DECLARE i integer; j INTEGER; begin i:=1; j:=count2; WHILE i<count loop update nameTable set intid=j where intid2=i; i:=i+1; j:=j+1; END loop; end; $$ LANGUAGE plpgsql VOLATILE COST 100; ALTER FUNCTION temp.update_intid(integer,integer,character varying(50)) OWNER TO postgres;

Andrey
02.05.2017
13:13:43
Во-первых, count рарезервированное слово.

Значения переменным можно присваивать прямо в declare - меньше кода будет.

А почему вы решили, что не передаётся?

Ааа.

Google
Andrey
02.05.2017
13:15:06
Надо execute использовать.

Admin
ERROR: S client not available

Andrey
02.05.2017
13:15:27
execute format('update %s set ...', nameTable);

А сами значения i и j биндить с помощью $

Как-то так

create or REPLACE function temp.update_intid(count1 integer, count2 integer, nameTable CHARACTER VARYING(50)) returns void AS $$ DECLARE i INTEGER := 1; j INTEGER := count2; BEGIN WHILE i < count1 loop EXECUTE format('update %s set intid=$1 where intid2=$2', nameTable) USING j, i; i:=i+1; j:=j+1; END LOOP; END; $$ LANGUAGE plpgsql VOLATILE COST 100; ALTER FUNCTION temp.update_intid(integer,integer,character varying(50)) OWNER TO postgres;

Алексей
02.05.2017
13:28:19
все отлично работает. спасибо огромное. теперь буду знать

Denis
02.05.2017
13:31:09
Ведь это же контринтуитивно вызывать в цикле построчное обновление. Почему именно так?

Anatoliy
02.05.2017
13:36:17
Возможно это имитация задержки

Алексей
02.05.2017
13:36:19
есть таблица заполненная у которой столбец intid пустой изначально при инсерте данных, после того как обработка таблицы закончена данные из нее переносятся в другую, и перед переносом нужно проставить значения в этот столбец по порядку начиная с заданного(предварительно перед этим узнав у другой процедуры с какого начать)

Darafei
02.05.2017
13:37:18
почему не что-то вроде update %s set intid=intid-count2 where intid between count2 and count2+count1; ?

а почему не проставить их при переносе через row_number() order by id?

Алексей
02.05.2017
13:45:59
row_number() вернет номер строки?

Denis
02.05.2017
13:46:41
row_number() вернет номер строки?
Да, посмотрите оконные функции

Алексей
02.05.2017
13:47:42
я не могу понять пока как мне это поможет

Darafei
02.05.2017
13:49:15
это убьёт функцию целиком и заменит её на один вызов row_number() в копировании

Алексей
02.05.2017
13:50:55
так row_number() нельзя же задать с какого числа начинать

Denis
02.05.2017
13:51:30
Google
Алексей
02.05.2017
13:52:47
точно))

спс.

Denis
02.05.2017
13:54:38
Вообще loop - это императивный подход, а sql все же подразумевает декларативность. Я могу высказаться слишком резко, но мое мнение - циклам не место в хранимых процедурах, их всегда можно заменить на средства sql (тот же lateral join). До 9.5 цикл использовался в одном широко известном паттерне-костыле вместо upsert, но с появлением on conflict - циклы должны умереть)

Darafei
02.05.2017
13:59:49
а как без циклов сделать, например, те же жадные алгоритмы выбора?

Denis
02.05.2017
14:03:10
а как без циклов сделать, например, те же жадные алгоритмы выбора?
Тут нужно смотреть конкретные примеры. Я просто не уверен, что такие вещи должны решаться на уровне функций базы, а не на сервере приложения

Darafei
02.05.2017
14:04:51
ну первый приходящий в голову пример - у меня есть облако в миллион точек, надо добыть из них подмножество, такое, что расстояние между ними максимально, и нет точек ближе N метров друг от друга

как это посчитать в приложении? :)

Denis
02.05.2017
14:09:04
Думаю, никак)) Я скажу больше, я даже не знаю оптимального алгоритма, как решать. Но я обдумаю на досуге

targitaj
02.05.2017
14:10:01
народ, надо ли в постгресе роли, созданной для обращений к БД приложением из локалки, давать пермишен login?

Darafei
02.05.2017
14:12:10
Думаю, никак)) Я скажу больше, я даже не знаю оптимального алгоритма, как решать. Но я обдумаю на досуге
ну, жадный - заселектить темповую таблицу, выбирать самого крайнего, возвращать его и удалять всех в минимальном радиусе вокруг него

Страница 316 из 1062