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

Denis
01.05.2017
09:21:11

Google

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

Andrey
01.05.2017
10:22:48

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
тогда лучше это)

KlonD90
01.05.2017
19:35:14

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

Денис
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

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

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

Google

Fike
02.05.2017
12:29:00

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

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?

Denis
02.05.2017
13:43:11

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

Denis
02.05.2017
13:46:41

Алексей
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