Pergunta relacionada sobre o mesmo projeto aqui.
Estou analisando duas abordagens para modelar uma relação hierárquica entre minhas tabelas de fatos e dimensões em um data warehouse para armazenar dados de infraestrutura de TI.
Considere como exemplo:
FACT_Folder
- Contém fatos sobre uma pasta do sistema de arquivos
Dim_Drive
- Uma pasta é vinculada a uma única entrada do DRIVE
Dim_Array
- Uma unidade é vinculada a um único array
Dim_Server
- Um array é vinculado a um único servidor
Dim_Farm
- Um servidor se conecta a um único farm
Para nossos propósitos, não precisamos nos preocupar com a transferência de uma pasta para uma unidade diferente.
Queremos poder obter métricas em todos os níveis dessa hierarquia.
Assumindo que eventualmente terei milhões de entidades de pasta (com dados diários) e centenas ou milhares de unidades, matrizes, etc; qual padrão de projeto você recomendaria e por quê?
Normalizado
- A está
Folder
vinculado a umDrive
, e o restante da hierarquia está entre as dimensões
- A está
eu desnormalizado
- Um
Folder
link para umDrive
, mas aDrive
dimensão contém toda a hierarquia para cadaDrive
entrada para cada linha
- Um
Desnormalizado II
- Um
Folder
link direto para todos os níveis da hierarquia
- Um
??????
Eu ligaria em todos/a maioria dos níveis. Essa estrela desnormalizada significa que sim, os dados são redundantes, mas geralmente facilita muito a geração de relatórios e análises. Observe que isso é muito diferente da normalização OLTP, e você normalmente não precisa se preocupar com dados redundantes ficando fora de sincronia porque em um cenário DW os dados nunca mudam. Novos fatos são adicionados e dimensões são expiradas e novas são criadas.
Não vejo Dim_Folder. Eu diria que o caminho real da pasta seria um atributo do Dim_Folder. Apenas a quantidade numérica e quaisquer dimensões degeneradas (http://en.wikipedia.org/wiki/Degenerate_dimension) estariam na tabela de fatos. Eu não pensaria no caminho da pasta como uma dimensão degenerada porque ele continua voltando em cada instantâneo (uma pasta não é uma transação).
Então você poderia fazer algo assim:
Veja como o uso de DIM_Folder torna o conjunto de dim ids pequeno e, em seguida, estamos assumindo algum tipo de índice na data do instantâneo e, em seguida, na pasta dim id (ou vice-versa).
Veja como agora você também não precisa ingressar na pasta se quiser apenas os dados em um nível superior. Como você geralmente sabe tudo isso no momento do ETL, há uma motivação diferente dos sistemas OLTP, onde você deseja que tudo se mova junto quando algo é alterado (osso da perna conectado ao osso da coxa, etc.). No cenário DW, você realmente não quer que nada se mova.
Então, bam! - análise total de uso da Fazenda:
Lembre-se de que as estrelas são realmente simples para análise. Você NUNCA precisa se preocupar com junções cruzadas inadvertidas em uma única estrela não floco de neve. Ao vincular estrelas diferentes, você TEM que tomar cuidado. Portanto, as consultas na MAIORIA dos casos são MUITO mais simples em esquemas em estrela. Nenhuma travessia de rede e preocupação com muitos relacionamentos como em um modelo normalizado.