поднять до версии 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 в таблицу вставить было нельзя.
> Делать костыль в виде триггера который при вставке будет сверять uuid с уже существующими пробегаясь по всей таблице - не вариант. Эээ... почему это "костыль"? > Алгоритм генерации UUID по идее гарантирует его уникальность, Почему бы на это не надеяться?
UUID это просто 16 байт, в них можно положить что угодно. Если туда положить что-то сортируемое по дате, то по этом полю можно шардироваться. Тогда у вас и ключ шардирования и ключ уникальности будут одним и тем же и вы получите глобальную уникальность. Как вариант посмотрите на ULID - миллисекундный таймстамп + 80 бит рандомности.
Обсуждают сегодня