Size: a a a

pgsql – PostgreSQL

2020 June 14

YS

Yaroslav Schekin in pgsql – PostgreSQL
B B
create schema my_schema
create table nation (
nation_id serial,
nation_name varchar (255) unique not null,
primary key (nation_id)
)
create table country (
country_id serial,
country_name varchar (255) unique not null,
primary key (country_id)
)
create table "language" (
language_id serial,
language_name varchar (255) unique not null,
primary key (language_id)
)
create table lang_nat (
language_id integer unique not null,
nation_id integer unique not null,
foreign key (language_id) references "language" (language_id),
foreign key (nation_id) references nation (nation_id)
)
create table nat_country (
nation_id integer unique not null,
country_id integer unique not null,
foreign key (country_id) references country (country_id),
foreign key (nation_id) references nation (nation_id)
);
Послушайте... что это такое, учебное задание?
Вы чему учитесь — реляционному проектированию, или работе с PostgreSQL (или ещё чему-то)?
Потому что схема содержит разнообразные ошибки по каждому из вышеуказанных пунктов.
Я к тому, что если Вас не интересует именно PostgreSQL, то 1) я не буду указывать на специфичные ошибки, но 2) с другой стороны, Вам придётся спросить об этом в каком-то другом чате. :)
источник

BB

B B in pgsql – PostgreSQL
Я учусь работать в PostgreSQL, это учебное задание, я нуб, но я уже дошёл до стадии отчаяния из-за какой-то ошибки, и не понимаю, что я делаю не так. Если объяснять долго, не утруждайтесь, буду дальше разбираться
источник

ЕР

Евгений Ры́марев... in pgsql – PostgreSQL
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
B B
Я учусь работать в PostgreSQL, это учебное задание, я нуб, но я уже дошёл до стадии отчаяния из-за какой-то ошибки, и не понимаю, что я делаю не так. Если объяснять долго, не утруждайтесь, буду дальше разбираться
Прочитайте вот это: https://wiki.postgresql.org/wiki/Don%27t_Do_This
Целиком и внимательно (потом покажите исправленную схему, на всякий случай ;) ). Это по специфике PostgreSQL.

Что касается проектирования:
1.
create table lang_nat (
language_id integer unique not null,
nation_id integer unique not null,
Это неправильная модель для many-to-many — как Вы сюда собираетесь вставлять тот же язык для двух наций?
Правильный первичный ключ для таких таблиц — (id1, id2).

2. Зачем у Вас country_id в странах? Есть же стандартные короткие коды стран...

3.  add column religion text[];

Почему Вы пытаетесь сделать эту связь массивом, а не добавляете таблицу?!

4. add column bilingual boolean;

Это, вообще, зачем? Нарушений целостности захотелось? А поле ternalingual Вы тоже потом добавите, если что? ;)

5. add column national_day timestamp;

Не тот тип данных. Хотите дату — есть date.
источник

ЕР

Евгений Ры́марев... in pgsql – PostgreSQL
2flower _
зачем каждое поле, равенство это когда оба входят друг в друга.

@>  jsonb  Левое значение JSON содержит на верхнем уровне путь/значение JSON справа?  '{"a":1, "b":2}'::jsonb @> '{"b":2}'::jsonb

у вас по идее js1@>js2 and js2@>js1
оказывается, что Алхимия может в такие штуки
cast(schema.column, JSONB).op('@>')(cast(value, JSONB))
источник

IZ

Ilia Zviagin in pgsql – PostgreSQL
B B
а потом добавляю новые поля (КОТОРЫЕ нужно закинуть в таблицу связей
Почему ты тогда добавляешь поля в основную таблицу ,а не в таблицу связи? Делай таблицу связи тогда.
источник

ЕР

Евгений Ры́марев... in pgsql – PostgreSQL
Евгений Ры́марев
оказывается, что Алхимия может в такие штуки
cast(schema.column, JSONB).op('@>')(cast(value, JSONB))
Ð, решил вопрос
источник

Ð

Ð in pgsql – PostgreSQL
действительно, алхимия
источник

BB

B B in pgsql – PostgreSQL
Yaroslav Schekin
Прочитайте вот это: https://wiki.postgresql.org/wiki/Don%27t_Do_This
Целиком и внимательно (потом покажите исправленную схему, на всякий случай ;) ). Это по специфике PostgreSQL.

Что касается проектирования:
1.
create table lang_nat (
language_id integer unique not null,
nation_id integer unique not null,
Это неправильная модель для many-to-many — как Вы сюда собираетесь вставлять тот же язык для двух наций?
Правильный первичный ключ для таких таблиц — (id1, id2).

2. Зачем у Вас country_id в странах? Есть же стандартные короткие коды стран...

3.  add column religion text[];

Почему Вы пытаетесь сделать эту связь массивом, а не добавляете таблицу?!

4. add column bilingual boolean;

Это, вообще, зачем? Нарушений целостности захотелось? А поле ternalingual Вы тоже потом добавите, если что? ;)

5. add column national_day timestamp;

Не тот тип данных. Хотите дату — есть date.
Спасибо за подробное объяснение, и спасибо, что помогаете, для новичка это сложно и любая поддержка это как ветер в парус во время штиля (сори за метафору). Буду дальше копать
источник

РЖ

Роман Жарков... in pgsql – PostgreSQL
Кайржан Турмагамбетов
Всем привет. Подскажите, может ли таблица на 1тб, с >млрд записями зависнуть на час в процессе добавления нового столбца.
Диски ssd
Варианта наверное три.
Главные два: ваш DDL блокируется какой-то длинной пишущей транзакцией ( типа вакуума ).
Вы создаёте столбец с установленным default-ым значением и оно долго инициализируется.
И третье: какая-нибудь с нхронная репликация ( сомневаюсь и в теме плаваю )
источник

.

.tmp in pgsql – PostgreSQL
всем привет, а какие подводные в FK таблицы на саму себя?
источник

РЖ

Роман Жарков... in pgsql – PostgreSQL
.tmp
всем привет, а какие подводные в FK таблицы на саму себя?
Если вдруг таблица вырастет сильно, вы задолбаетесь её партицировать.
источник

.

.tmp in pgsql – PostgreSQL
Роман Жарков
Если вдруг таблица вырастет сильно, вы задолбаетесь её партицировать.
а какие альтернативы, если таблица отображает что-то типа дерева? или это сам по себе плохой паттерн?
источник

КТ

Кайржан Турмагамбето... in pgsql – PostgreSQL
Роман Жарков
Варианта наверное три.
Главные два: ваш DDL блокируется какой-то длинной пишущей транзакцией ( типа вакуума ).
Вы создаёте столбец с установленным default-ым значением и оно долго инициализируется.
И третье: какая-нибудь с нхронная репликация ( сомневаюсь и в теме плаваю )
Not null default влияет?
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Кайржан Турмагамбетов
Нет, все потушили. Только алтер был
Если это действительно перезапись таблицы — это нужно записать минимум 2 Тб (а на самом деле — куда больше, индексы-то у Вас есть, я надеюсь?).
И передать существенную часть этого по сети (но это имеет значение только для синхронных реплик, обычные просто в худшем случае отстанут / отвалятся).
Какая это версия PostgreSQL? Можете показать SQL, которым добавляли поле?
источник

РЖ

Роман Жарков... in pgsql – PostgreSQL
Кайржан Турмагамбетов
Not null default влияет?
По-любому, дефолт.
Разделите операцию на четыре части: просто добавьте пустое поле без условий. Установите дефолт. Потом заполните потихоньку. Потом навесьте остальные условия типа not null.
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Роман Жарков
Если вдруг таблица вырастет сильно, вы задолбаетесь её партицировать.
Почему? RANGE по id, и нормально, нет?
источник

РЖ

Роман Жарков... in pgsql – PostgreSQL
Yaroslav Schekin
Почему? RANGE по id, и нормально, нет?
У меня устаревшие сведения. Помню только, что при перекладывании данных пришлось развязывать внешние ключи.
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
.tmp
а какие альтернативы, если таблица отображает что-то типа дерева? или это сам по себе плохой паттерн?
"Дерево" может храниться в отдельной таблице, например.
Но это больше подходит для графов; или для случаев, когда относительно мало объектов связаны друг с другом.
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Роман Жарков
У меня устаревшие сведения. Помню только, что при перекладывании данных пришлось развязывать внешние ключи.
Для этого нужна актуальная версия PostgreSQL, да (сходу не помню, 12 или 11).
источник