
Pavel
20.10.2018
18:59:34
например надо связать таблицу Users и таблицу Words

Bogdan
20.10.2018
18:59:49

Pavel
20.10.2018
19:01:37
а правильно ли я понимаю что таблица будет из трех колонок id|user_id|words_id

Google

Pavel
20.10.2018
19:02:16
и там данные вида
1|1|1
2|1|2
3|1|3
4|2|1
5|2|2
6|2|3

Bogdan
20.10.2018
19:02:22
а вордс какого вида будет?
id, userId, word:text ?
для быстрого поиска по словам можно сделать втвблицк поле
words: text[] -- массив
и потом оп нему сделать gin индекс, и будет некое подобие счастья, хотя это сопрный момент, стоит так делать или нет
для этого надо понимать как работают gin индексы )

Sergey
20.10.2018
19:03:05

Bogdan
20.10.2018
19:03:49
я бы советовал вам поля по сокращать, если не охота менять код, то хотябы аннотацию навесить, с указанием имени
а для embedded вобще jsonb использовать ?

Pavel
20.10.2018
19:04:27
words у меня тоже будет иметь куча полей, поэтому хочу третью таблицу где буду хранить связи айдишников

Bogdan
20.10.2018
19:07:23
если к юзеру нельзя одно и то-же слово два раза привязывать, то вполне нормально, как по мне

Pavel
20.10.2018
19:09:42
круто, спасибо)
да, к юзеру только одно слово
а по скольку я только дней пять вожусь с бэком и бд, можно мне в кратце пояснить что делает тот констрейнт, а точней что за UserWords_pk, а что делает констрейнт я понял
и вот это CREATE INDEX "UserWords_words" ON "UserWords" (word_id, user_id); для чего

Bogdan
20.10.2018
19:12:05
primary key
если ключ не сосотавной, как здесь, то просто пишут
id int primary key
так как праймари ключ по двум коллонкам, то надо так указывать

Google

Bogdan
20.10.2018
19:12:22

Pavel
20.10.2018
19:12:49
о спасиб

Bogdan
20.10.2018
19:13:35
можно было-бы обойтись только "UserWords_words" ON "UserWords" (word_id)
но если две коллонки, то будет Index Only Scan т.е. база будет только с индекса читать, и не искать на диске отдельно строчку

Pavel
20.10.2018
19:14:50
а блин UserWords_pk это ж просто имя констрейнта, верно?

Bogdan
20.10.2018
19:15:00
+

Terminator
20.10.2018
19:24:10
@oldfk будет жить. Поприветствуем!

Sergey
20.10.2018
19:41:04

Bogdan
20.10.2018
19:48:51
по одному пальцу за лишний символ)

Pavel
20.10.2018
21:13:33
подскажите еще плз, что надо сделать что бы в колонке одной таблицы автоматом появлялся айдишник из другой таблицы, и что бы это было двунаправлено
Я таким образом хочу связать метаданные статьи и саму статью
Я правильно делаю ?

Bogdan
20.10.2018
21:16:18
1) проинсертил стетью
2) поулчил айди
3) проинсертил метаданные, указав полученый ID
см "RETURNING" в доке https://www.postgresql.org/docs/9.5/static/sql-insert.html
тип returning id

Roman
20.10.2018
21:32:16
Правда надо быть с ретёрнингом аккуратнее. А то я как то случайно обернул возвращаемые значения в круглые скобки - и долго не мог понять почему ADO.NET видит там object[]))

Pavel
20.10.2018
21:58:23
а что, id, createdAt, uptadetAt это обязательные поля?

Bogdan
20.10.2018
23:06:19

Roman
21.10.2018
05:30:01

Ivan
21.10.2018
06:16:59
Лучше bigserial
Зависит от планируемого количества объектов) Можно и uuid херануть с дуру ?

Roman
21.10.2018
06:18:38

Google

Bogdan
21.10.2018
11:31:49
Лутче перебдеть, чем недобдеть

Maxim
21.10.2018
11:48:18


Bogdan
21.10.2018
12:12:58
CREATE INDEX CONCURRENTLY
Добрый день) Пишу plpgsql блок, для maintnence задачи, надо раз в N дней создавать новый индекс
ERROR: CREATE INDEX CONCURRENTLY cannot run inside a transaction block при вызове EXECUTE ddl;
решил пробелму так:
ddl := $$
CREATE INDEX CONCURRENTLY .....
$$;
PERFORM dblink_exec('dbname=' || current_database() ||' user=postgres ',ddl);
вопрос, наскольк плохо испоьзовать dblink_exec ? не просто так-же они не дают вызывать CREATE INDEX CONCURRENTLY
Но не хотелось писать на баше логику, хотел ограничится чисто plpgsql.
просто sql скрипт не подходит, потмоу что мне надо динамически генрировать WHERE условие дялиндекса:
format(' ... WHERE message_timestamp > %L::timestamp with time zone ;', last_date);
По сути у меня индекс покарывает последние два месяца данных, для быстрых запросов, остальное идет по дургому индексу.
такой-себе недо-шардинг.
After the second scan, the index build must wait for any transactions that have a snapshot (see Chapter 13) predating the second scan to terminate. :(
как сделать, чтобы сессия не имела snapshot ?
В блоке PLPGSQL вобще нету DML операций
оно на блок DO ругается, что-ли?


Andrey
21.10.2018
12:47:58
Снапшот это просто список транзакций выполняюшизся параллельно с текущей плюс xid.

Bogdan
21.10.2018
12:50:54

Andrey
21.10.2018
12:52:28
Ну те, с которыми могут быть конфликты только.

Bogdan
21.10.2018
12:54:53
придумал, буду скриптисполнят на базе postgres, а DDL через dblink выполнять на базе рабочей

Петр
21.10.2018
12:57:49
Не вижу дедлока

Bogdan
21.10.2018
12:59:14
Не вижу дедлока
я уже убил сессию, и не сохранил вывод select * from pg_locks (
ну через часа 3-4 узнаем, помог ли запуск через другую базу
потмоу что лок возникал не сразу, а на финально стадии бида индекса

Terminator
21.10.2018
16:31:32
Люся будет жить. Поприветствуем!


Bogdan
21.10.2018
17:45:47
CREATE INDEX CONCURRENTLY
Добрый день) Пишу plpgsql блок, для maintnence задачи, надо раз в N дней создавать новый индекс
ERROR: CREATE INDEX CONCURRENTLY cannot run inside a transaction block при вызове EXECUTE ddl;
решил пробелму так:
ddl := $$
CREATE INDEX CONCURRENTLY .....
$$;
PERFORM dblink_exec('dbname=' || current_database() ||' user=postgres ',ddl);
вопрос, наскольк плохо испоьзовать dblink_exec ? не просто так-же они не дают вызывать CREATE INDEX CONCURRENTLY
Но не хотелось писать на баше логику, хотел ограничится чисто plpgsql.
просто sql скрипт не подходит, потмоу что мне надо динамически генрировать WHERE условие дялиндекса:
format(' ... WHERE message_timestamp > %L::timestamp with time zone ;', last_date);
По сути у меня индекс покарывает последние два месяца данных, для быстрых запросов, остальное идет по дургому индексу.
такой-себе недо-шардинг.
в общем, если кому интесно, запуск срипта на базе postgres и выполенение создания индексов на рабочей базе через dblink сработало! ?


Terminator
21.10.2018
18:43:22
Марина Вере... будет жить. Поприветствуем!
Abc будет жить. Поприветствуем!
@Blacklady 77 будет жить. Поприветствуем!

Google

Aleksander
22.10.2018
06:53:33
Ребят не могу сгенерить 10 миллионов уникальных значений цифр 9 позиций которых будут уникальны. Помогите плиз. И чтобы это не были цифры последовательны от 00000001 до 10000000
select distinct substr('121'||floor(random() * 999999999999999)::numeric,1,12)::numeric as qrcode
from generate_series(1,10000000)as sn
так не подходит появляются не уникальные значения

Александр
22.10.2018
06:58:30
А generate_series если отсортировать в случайном порядке?

Yaroslav
22.10.2018
06:58:38

Aleksander
22.10.2018
07:00:10
нет мне в таблицу надо положить 10 млн уникальных значений в поле qrcode
по маске 121 и потом 9 значений уникальных

Denis
22.10.2018
07:04:13
нагенерируйте заведомо больше, отсортируйте в случайном порядке и возьмите столько, сколько нужно

Aleksander
22.10.2018
07:05:44

Bogdan
22.10.2018
07:05:55

Aleksander
22.10.2018
07:06:12

Алексей
22.10.2018
07:06:17
добрый день. подскажите есть ли готовые решения, чтобы настроить репликацию из oracle в pg ?

Aleksander
22.10.2018
07:06:30
последовательного смысла не должно выявляться

Bogdan
22.10.2018
07:06:46

Aleksander
22.10.2018
07:07:21
а мне конкретно 10 млн надо чтобы постоянно генерил вперемешку уникально

Bogdan
22.10.2018
07:07:59
т.е. с дырками надо?

Denis
22.10.2018
07:08:15

Aleksander
22.10.2018
07:08:27

Google

Bogdan
22.10.2018
07:08:35
заюзай UUID
скажем у тебя есть уже 200 лямов, и ты хчоешь сгенрить еще 10 рандомных
и проерить что таких уже неыбло, то база обсорется проверять по индексу
merge join 10 M + 200M это не так себе и быстро

Aleksander
22.10.2018
07:10:21

Denis
22.10.2018
07:12:27
http://preshing.com/20121224/how-to-generate-a-sequence-of-unique-random-integers/
я вот этим воспользовался в похожем случае.