AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 24445
Accepted
JNK
JNK
Asked: 2012-09-18 12:16:47 +0800 CST2012-09-18 12:16:47 +0800 CST 2012-09-18 12:16:47 +0800 CST

Devo vincular um fato à dimensão hierárquica em TODOS os níveis ou apenas no mais granular?

  • 772

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ê?

  1. Normalizado

    • A está Foldervinculado a um Drive, e o restante da hierarquia está entre as dimensões
  2. eu desnormalizado

    • Um Folderlink para um Drive, mas a Drivedimensão contém toda a hierarquia para cada Driveentrada para cada linha
  3. Desnormalizado II

    • Um Folderlink direto para todos os níveis da hierarquia
  4. ??????

database-design data-warehouse
  • 1 1 respostas
  • 1255 Views

1 respostas

  • Voted
  1. Best Answer
    Cade Roux
    2012-09-18T12:45:40+08:002012-09-18T12:45:40+08:00

    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:

    SELECT AVG(bytes_on_disk)
    FROM FACT_Folder
    INNER JOIN DIM_Folder
        ON FACT_Folder.FolderDimID = DIM_Folder.DimID
    INNER JOIN DIM_Date
        ON FACT_Folder.SnapshotDateID = DIM_Date.DateID
    WHERE DIM_Date.Date BETWEEN '20120101' AND '20121231'
        AND DIM_Folder.FolderPath = '/usr/bin/'
    

    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:

    SELECT DIM_Farm.Farm_Name, SUM(bytes_on_disk)
    FROM FACT_Folder
    INNER JOIN DIM_Farm
        ON FACT_Folder.FarmDimID = DIM_Farm.DimID
    INNER JOIN DIM_Date
        ON FACT_Folder.SnapshotDateID = DIM_Date.DateID
    WHERE DIM_Date.Date BETWEEN '20120101' AND '20121231'
    GROUP BY DIM_Farm.Farm_Name
    

    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.

    • 5

relate perguntas

  • Qual é a diferença entre os tipos de dados MySQL VARCHAR e TEXT?

  • É melhor armazenar os valores calculados ou recalculá-los a pedido? [duplicado]

  • Armazenar vs calcular valores agregados

  • Quais são algumas maneiras de implementar um relacionamento muitos-para-muitos em um data warehouse?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve