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 ответов

16 просмотров

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

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

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

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

Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
И никого не интересует какие пакеты кто использует. ((% Заходишь на сайт симфони и видишь поддержку Украины - по законам РФ это ж экстремизм. Только никто не отказывается от с...
Am Ambrion
11
лучше скажите, причём тут паскаль?
Alexey Kulakov
36
Чтобы перехватить все нажимания буков на форме, надо хук ставить? Пробовал на форме ОнКейДаун, оно ловит клаву если фокус не на компоненте с вводом текста
Serjone
15
Но, может, есть уже проверенная? Наши требования такие: 1. Сообщения должны приходить из Инста в CRM оду 2. Должна быть возможность подключить несколько экаунтов Инстаграм. Р...
Alexander Sharoiko MSE / Александр Шаройко
7
Народ! Впервые клиенту пришло письмо от РКН, у вас, дескать, есть яндекс метрика, а нигде не написано, что вы ее юзаете. Никто не сталкивался?
Sasha Beep
14
Всем привет! вывожу на общей стр дочерние ресурсыв каждом ресурсе галерея, и первая фотка должна выводиться на общей [!DocLister? &prepare=photo !]
Alekso
12
Я правильно понимаю что нет способов получить список ожидающих заявок на вступление в группу с помощью бота из mtproto?
Шамиль Прилов
7
А можно вопрос? Мне сегодня сказали что у меня функция (которая просто заполняет массив значениями) не правильная void Full(double * arr, int n) { for (int i = 0; i < n; i...
† C E †
7
Добрый вечер. Хочу чтобы у меня в классе поле было функцией, которая возвращает строку. Делаю так: interface ... TGetOutPath = function : String of object; ... protec...
Kirill Filippenok
12
Карта сайта