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.