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)
);
Другие вопросы по тегам