Depois de ler várias perguntas sobre SO, postagens externas no blog e manual
- SO : restrição de chave estrangeira para tabela particionada na página
- dba.SE : Diferentes maneiras de manipular o FK para tabela particionada na página
- Manual : Herança
- Manual : Particionamento
- Manual : Gatilhos de restrição
- Blog : Modelagem do Postgres com herança
Ainda me pergunto se devo ir com o particionamento considerando meu caso ou não.
O caso - simplificado
Armazenando dados do cliente. Todos os nomes das tabelas mencionadas abaixo são compensados.
Tendo objetos que são identificáveis pelo cliente e são seres não-físicos, também seus objetos físicos nos quais eles são realmente armazenados no caso de precisar enviar alguns objetos de volta ao cliente sob demanda ou processá-lo de outras maneiras. Eles são mapeados em um relacionamento muitos-para-muitos.
objects_nonphysical
,objects_physical
,objects_mapping_table
.O segundo relacionamento muitos para muitos é entre esses objetos não físicos e suas métricas. Existem objetos que estão vinculados a algumas métricas.
metrics
,metrics_objects_nonphysical
Os objetos não-físicos e físicos têm suas tabelas de hierarquia que são relações pai-filho.
objects_nonphysical_hierarchy
,objects_physical_hierarchy
Dependendo das necessidades e requisitos de cada cliente, os dados sobre objetos físicos podem ser fornecidos ou necessários a partir do zero. Basicamente, o que eu preciso fazer é:
Mantenha o sistema interno para instruções
INSERT
eSELECT
declarações rápidas , porque é aqui que o mapeamento será realizado.Mantenha o sistema para o cliente externo visualizar e operar seus objetos não físicos - recuperação rápida de dados. Forte necessidade de eficiência nas
SELECT
declarações - esses dados estão disponíveis para muitos clientes pesquisarem quando quiserem.
Minha consideração
Pode haver um cliente, que pode acessar os dados, visualizá-los e operá-los, mas isso não precisa ser um contratado para o qual obtivemos os dados / estamos processando os dados.
Isso me levou a introduzir o particionamento de tabela no meu sistema, considerando que eu sempre sei em quais dados da partição se enquadram ( particionamento para contratados ) e, em seguida, cria o sistema para o cliente externo, onde eu preciso particionar para os clientes (isso seria feito com alguns atrasar o uso de ferramentas de automação e conjunto de regras para reescrever os dados da maneira dos clientes, para que, para cada cliente, verifiquemos apenas uma partição para cada tabela.
Volume de dados
Meus dados vão crescer constantemente, especialmente ao importar objetos e métricas de novos clientes. O ritmo de entrada de novos dados no sistema é imprevisível no momento a longo prazo. Realmente não há como medir isso sem saber quem será o próximo cliente. No momento, existem apenas 2 clientes com mais ou menos 1 milhão de linhas para cada cliente em todas as tabelas. Mas, no futuro, prevejo que novos clientes também venham com um volume de 10 milhões de linhas.
Questões
Essas questões estão todas relacionadas entre si.
- O particionamento deve realmente ser considerado aqui, ou isso é um exagero? Considero que é útil, pois estou sempre digitalizando exatamente uma partição.
- Se o particionamento é o caminho a seguir, como impor
FK
restrições da maneira mais eficaz, considerando minhas necessidades? Devo procurarconstraint triggers
, ou apenas mantê-lo na camada de aplicação do sistema interno, ou talvez algum outro método? - Se o particionamento não é o caminho a seguir, em que devo mergulhar?
Se não houver dados suficientes, informe-nos nos comentários abaixo.
fonte
Respostas:
Existem muitas questões em aberto na sua pergunta, mas o particionamento por cliente pode ser o caminho a seguir - especialmente se:
REGRAS ou gatilhos são uma sobrecarga de desempenho e podem ser evitados.
Considere algo nesse sentido:
Você não precisa de nenhum gatilho / regra para mantê-lo.
Existem pontas abertas aqui - isso é apenas um rascunho ... Alguns problemas:
fonte
Não será prejudicial se você implementar o particionamento agora, mas use uma única partição até que o sistema realmente exija uma nova. Em termos de desempenho, haverá apenas uma pequena sobrecarga, para lidar com chaves primárias e coisas do gênero.
Eu recomendo o uso de regras para redirecionar inserções e uma tabela externa para as chaves primárias (por exemplo
CREATE TABLE objects_physical_ids (id bigserial NOT NULL PRIMARY KEY)
, junto com um acionador de função que insere uma linha na tabela de ids e a copia para NEW.id (por exemploINSERT INTO objects_physical_ids DEFAULT VALUES RETURNING id INTO NEW.id;
), e outros acionadores que tratam da exclusão e atualizações, e um gatilho executando esses gatilhos de função para cada tabela herdada (não se esqueça de fazer isso ao criar uma nova tabela herdada!). Todas as tabelas relacionadas podem ter umaFOREIGN KEY
na tabela de IDs relevantes (incluindo quaisquer ações de chave estrangeira, comoON UPDATE
ouON DELETE
)fonte