Sharding Postgresql с расширением Citus не работает
Я использую Postgresql с расширением citus для шардинга и не могу шардить таблицы, как показано ниже. Внизу таблицы есть первичный ключ и 2 уникальных ключа. Я пытаюсь осколить столбец с первичным ключом, т.е. pid
,Примечание. Мне не разрешено изменять структуру таблицы. Эти таблицы создаются инструментом.
CREATE TABLE person
(
pid bigint NOT NULL,
name character varying(100),
address_pid bigint NOT NULL,
address_type character varying(100),
CONSTRAINT id_pkey PRIMARY KEY (pid),
CONSTRAINT addr_id UNIQUE (address_pid),
CONSTRAINT addr_type_id UNIQUE (address_type, address_pid)
);
Это мой осколочный запрос:
select create_distributed_table('person', 'pid');
Ошибка это бросить это:
Error: Distributed relations cannot have UNIQUE, EXCLUDE, or PRIMARY KEY constraints that do not include the partition column
Может ли кто-нибудь помочь мне с осколками таких таблиц?
@CraigKerstiens Дополнение к этому вопросу:
Как обрабатывать шардинг, когда у нас есть несколько внешних ключей, таких как этот.
CREATE TABLE table
(
pid bigint NOT NULL,
search_order integer NOT NULL,
resource_pid bigint NOT NULL,
search_pid bigint NOT NULL,
CONSTRAINT hfj_search_result_pkey PRIMARY KEY (pid),
CONSTRAINT idx_searchres_order UNIQUE (search_pid, search_order),
CONSTRAINT fk_searchres_res FOREIGN KEY (resource_pid)
REFERENCES public.table1 (res_id) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION,
CONSTRAINT fk_searchres_search FOREIGN KEY (search_pid)
REFERENCES public.table2 (pid) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION
)
Предполагая, что table1 и table2 уже сегментированы.
1 ответ
В настоящее время в Citus вы не можете иметь уникальное ограничение, которое не включает столбец, на который вы разбиваете. В этом случае можно было бы обеспечить, чтобы адреса были уникальными для идентификатора человека, но не глобально уникальными. Для этого вы могли бы:
CREATE TABLE person
(
pid bigint NOT NULL,
name character varying(100),
address_pid bigint NOT NULL,
address_type character varying(100),
CONSTRAINT id_pkey PRIMARY KEY (pid),
CONSTRAINT addr_id UNIQUE (pid, address_pid),
CONSTRAINT addr_type_id UNIQUE (pid, address_type, address_pid)
);