O meu entendimento da granularidade da tabela de fatos está correto?


8

Eu e outro DBA da nossa empresa temos a tarefa de revisar um design de banco de dados que um fornecedor desenvolveu para nós. O fornecedor disse que usa Kimball como base para seu design. (NOTA: Não estou procurando argumentos de Kimball vs Inmon, etc.) Eles criaram um mercado com vários fatos e dimensões.

Agora, com toda a justiça, nossa empresa nunca projetou um único mercado. Sempre tivemos os consultores fazendo isso. E nunca fomos enviados para aulas nem nada. Portanto, nosso conhecimento sobre armazenamento / marcadores / modelagem dimensional etc. baseia-se na pouca experiência que temos, no que podemos encontrar na Internet e na leitura pessoal (temos os livros de Inmon e Kimball e estamos tentando fazê-lo). .

Agora que o cenário está preparado para o meu nível de conhecimento, chegamos ao desafio do design.

Existe uma tabela de fatos chamada "Estatísticas de perda de sinistros" (isso é para seguros). E eles estão tentando capturar os pagamentos de reivindicações (acumulados até um nível mensal) e, em seguida, o dinheiro nas reservas (como uma conta bancária para reivindicações). Eles desejam ver os valores mensais dos pagamentos (nada demais). Mas eles desejam ver o saldo atual da conta das reservas.

Vou dar um exemplo pictórico.

Digamos que configuramos US $ 1000 em reservas para uma reivindicação. Isso é anulado (portanto, em alguns aspectos, funciona como uma conta bancária).

Em outubro de 2014, ainda não pagamos nada. Portanto, a empresa deseja ver os pagamentos e o saldo da reserva no final de outubro.

-----------------------------------------------
-  MONTH_YEAR  -  PAYMENTS -  RESERVE_BALANCE -
-----------------------------------------------
-      102014  -      0.00 -          1000.00 -
-----------------------------------------------

Então novembro chega. Fazemos pagamentos de US $ 100, US $ 150 e US $ 75 dólares. Eles desejam ver esses valores agregados e a reserva no saldo da seguinte forma:

-----------------------------------------------
-  MONTH_YEAR  -  PAYMENTS -  RESERVE_BALANCE -
-----------------------------------------------
-      102014  -      0.00 -          1000.00 -
-----------------------------------------------
-      112014  -    325.00 -           675.00 -
-----------------------------------------------

E então digamos que temos zero pagamentos em dezembro e mais US $ 200 em janeiro do próximo ano.

-----------------------------------------------
-  MONTH_YEAR  -  PAYMENTS -  RESERVE_BALANCE -
-----------------------------------------------
-      102014  -      0.00 -          1000.00 -
-----------------------------------------------
-      112014  -    325.00 -           675.00 -
-----------------------------------------------
-      122014  -      0.00 -           675.00 -
-----------------------------------------------
-       12015  -    200.00 -           475.00 -
-----------------------------------------------

Aqui é onde eu luto. Meu entendimento é que a parte de pagamentos está correta. Todos eles são agregados mensalmente em cada registro. Assim, você pode fazer o rollup adicional, se desejar para o ano, trimestre, etc.

Mas o valor das reservas é diferente. É um equilíbrio. E a empresa quer ver quanto está em jogo a cada mês. Mas você não pode agregar neste campo. Se você o fizesse, obteria alguns resultados instáveis.

De alguma forma, isso me parece errado. Mas não posso dizer sinceramente que modelei o suficiente ou sei o suficiente. Tudo o que posso dizer é o que sei. E pelo que sei, todos os valores em um Fato devem ter a mesma granularidade.

Ambos os números têm a mesma granularidade de um "mês", mas não são do ponto de vista do que representam. Um é o agregado de dólares em um mês. O outro é apenas o equilíbrio.

Isso está correto? Eu tenho empurrado para trás este design. Estou errado em fazer isso? Tudo bem fazer isso de fato? Ou o meu senso de "cheiro de código" de um design ruim é preciso?

Qualquer ajuda seria apreciada. NOTA: por favor, não diga apenas "Deveria ser o modo X", por favor, explique por que deveria ser assim para que eu possa aprender com isso.

EDIT : Bem, eu aprendi que meu entendimento inicial do Fato está errado. A granularidade NÃO é mensal. A granularidade é o nível da transação. Isso significa que, dentro de MONTH_YEAR (ou seja, é o período do relatório financeiro), haverá várias transações de pagamento e recuperação. Aqueles serão lançados por data ou data da transação. Porém, devido a um relatório anterior que a empresa vê e também à maneira como os dados são armazenados no sistema legado de origem, eles queriam colocar os dados transacionais (uma linha por) e o saldo mensal de reserva (uma linha por mês). )

Depois que soube disso, percebi que o problema não era tanto aditivo versus não aditivo, nem mesmo semi-aditivo, mas grãos, que era o que eu suspeitava desde o início. Nossa equipe de DBA discutiu isso com a equipe do projeto e relatou que eles estão tentando colocar dois grãos diferentes no mesmo fato, e isso não estava correto. Que eles devem distribuir as transações para um nível mensal, permitindo que eles recebam os pagamentos, recuperações e o saldo da reserva mensal (isto é, um fato semi-aditivo), porque tudo estaria em um nível mensal. Ou eles precisam encontrar uma maneira de dividir o saldo da reserva em transações para preservar a granulação no nível da transação. Ou eles precisam dividir o fato em dois fatos. Um pode ser o nível mensal para o saldo da reserva. O outro pode estar no nível da transação para pagamentos e recuperações. (Não há razão para que eles também não pudessem colocar os pagamentos e recuperações em um nível mensal no fato do nível mensal também. Depende das necessidades da empresa.)

Dado o que aprendi, vou marcar a resposta de Thomas como a correta. No entanto, sinto que a discussão que comecei com a pergunta original ainda é boa para os outros aprenderem, por isso deixarei intacta a parte original da minha pergunta. Também pretendo conceder uma recompensa à resposta de nikadam, pois isso me ensinou muito sobre fatos aditivos, não aditivos e semi-aditivos, e corrigi muitos mal-entendidos que tive sobre modelagem dimensional.

Respostas:


5

Sua intuição do cheiro do código está bem aprimorada.

Você está lidando com o reserves que Kimball chama de "fato semi-aditivo". Não acumula muito bem em um trimestre ou ano.

A solução típica para isso é ter duas tabelas de fatos, uma para o fato aditivo ( paymentsno seu caso) e outra para o fato não aditivo. O fato não aditivo na verdade não precisa ter um grão no nível do mês, você pode armazená-lo durante todo o dia e as coisas ainda funcionam.

O fato não aditivo reserve,, é consultado de maneira diferente do outro fato. Você precisa tomar uma decisão comercial: O que significa reserveno nível do ano? É o último mês do ano, ou talvez a média dos meses do ano? Qualquer que seja a sua escolha, você pode encontrar a solução para modelá-la nos livros de Kimball, nos capítulos sobre fatos não-aditivos.

Observe que, se você usar um produto de cubo como o Analysis Services, é possível que os agregados "funcionem" mesmo que você armazene tudo em uma tabela. No entanto, prefiro manter as coisas separadas, para que as consultas relacionais sejam mais fáceis de escrever (e os fatos também são mais fáceis de carregar).


Então você está propondo que os dois valores sejam divididos em dois fatos, um aditivo e um não aditivo? (Na verdade, era para isso que eu estava me inclinando.) Mesmo assim, você pode fornecer uma razão para isso? Kimball diz mesmo para não misturar valores aditivos e não aditivos de fato?
22614 Chris Aldrich

4
Como alternativa, você pode transformar seu fato não aditivo reserveem um fato aditivo payment into reserve, que terá o mesmo nível de granularidade que payment out of reservevocê tem agora.
mustaccio 23/09

@ ChrisAldrich: considere a consulta em que você deseja combinar a SOMA de pagamento de um ano e o valor da reserva do mesmo ano. Se os dois fatos fossem combinados na mesma tabela, você entraria em algumas consultas desagradáveis. Se você tiver as duas medidas em tabelas separadas, a consulta será trivial para gravação.
Thomas Kejser 23/09

7

Você está correto: " grãos diferentes não devem ser misturados na mesma tabela de fatos ".

Mas o saldo da reserva no final do mês e a soma dos pagamentos no final do mês estão no mesmo grão. Apenas um dos fatos é semi-aditivo . O tipo de fato (aditivo ou não) não define o grão da tabela.

Pelo que você descreve, vejo o seu grão como "instantâneo de reivindicação mensal", que torna sua tabela de fatos "Tabela de fatos periódicos sobre instantâneos ".

Em este artigo Kimball tem um exemplo de fatos de aditivo e semi-aditivo na mesma tabela de verdade.

Aqui está um exemplo de captura instantânea periódica com fatos semi-aditivos do The Data Warehouse Toolkit (página 116):

Kit de ferramentas do Data Warehouse de Kimball, página 116

A melhor prática é ter uma tabela de fatos transacional que reflita todas as alterações na reserva (pagamentos e ajustes) no nível atômico mais baixo. Quando você lida com reivindicações, geralmente o nível atômico não é reivindicação, mas sub-reivindicação (sua companhia de seguros pode ter seu próprio termo para isso). Geralmente, cada sub-reivindicação representará uma parte diferente na reivindicação e pagamentos / reservas para cada parte. Por exemplo, pode não haver pagamentos ao segurado, mas pagamentos a não segurados pela pessoa ferida da sua empresa e pagamentos ao hospital e ao advogado.

Dependendo do desempenho da sua ferramenta de BI, você pode usar a tabela de fatos transacionais diretamente para obter pagamentos e saldos mensais. Ou você pode atualizar a tabela periódica de fatos de captura instantânea a partir de transações diárias ou no final do mês.

A capacidade de lidar com fatos semi-aditivos dependerá da camada de BI que você estiver usando. Algumas ferramentas são capazes de lidar facilmente com fatos semi-aditivos e outras não.

O livro principal de Kimball ( The Data Warehouse Toolkit ) possui um capítulo completo (16) sobre seguros.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.