172 похожих чатов

Добрый день. Есть вопрос по поводу партиционирования PostgreSQL. Версия PostgreSQL 9.6 (возможность

поднять до версии 10-11 есть).

Есть таблица которую нужно разбить на партиции. В таблице есть поле даты/времени создания записи, планируется партиционировать по этому полю, создавать партиции и вставлять в них строки по принципу Имя_Таблицы_гггг_мм.
Функция и триггер уже написаны, все работает, партиции создаются, данные распределяются по дате создания.
Проблема в следующем:
В качестве Primary Key записи используется поле ID типа uuid.
Соответственно при создании партиций уникальность ключа uuid PostgreSQL проверяет только в рамках одной партиции, то есть вставить один и тот же uuid в одну партицию нельзя, но если взять уже существующий uuid из одной партиции (например Имя_Таблицы_2018_10) и вставить запись с этим uuid в другую партицию (Имя_Таблицы_2018_11) то вставка пройдет. В итоге в рамках всей таблицы uuid будет не уникален, а уникальна только связка идентификатор строки uuid+поле дата/время.
В случае если бы в качестве Primary key использовалось поле типа serial проблема бы решалась просто - sequence родительской мастер таблицы наследовали бы все партиции и Primary key был бы уникален для всей таблицы (в масштабе всех партиций).
В Oracle, насколько я знаю, такая проблема решается при помощи глобального индекса, но в PostgreSQL глобальных индексов вроде нет?

Подскажите, может кто-то сталкивался с такой проблемой? Требование уникальности ID uuid в рамках всей таблицы критично. В случае если первичный ключ сделать составным - ID + DateTime тоже не подходит.

Делать костыль в виде триггера который при вставке будет сверять uuid с уже существующими пробегаясь по всей таблице - не вариант.
Алгоритм генерации UUID по идее гарантирует его уникальность, но даже при этом условии необходимо гарантировать чтобы дублирующие uuid в таблицу вставить было нельзя.

2 ответов

17 просмотров

> Делать костыль в виде триггера который при вставке будет сверять uuid с уже существующими пробегаясь по всей таблице - не вариант. Эээ... почему это "костыль"? > Алгоритм генерации UUID по идее гарантирует его уникальность, Почему бы на это не надеяться?

UUID это просто 16 байт, в них можно положить что угодно. Если туда положить что-то сортируемое по дате, то по этом полю можно шардироваться. Тогда у вас и ключ шардирования и ключ уникальности будут одним и тем же и вы получите глобальную уникальность. Как вариант посмотрите на ULID - миллисекундный таймстамп + 80 бит рандомности.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта