Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Menu Docs
Página inicial do Docs
/
Manual do banco de dados
/ / /

Dimensões que mudam lentamente

Dimensões de mudança lenta (SCDs) são uma framework para gerenciar e rastrear alterações nos dados de dimensão em um data warehouse ao longo do tempo. Essa estrutura se refere às dimensões como "mudança lenta" porque pressupõe que os SCDs de dados cobrem mudanças com baixa frequência, mas sem nenhum padrão aparente no tempo. Use SCDs quando os requisitos do data warehouse cobrirem a funcionalidade de rastrear e reproduzir saídas com base em estados históricos de dados.

Um caso de uso comum para SCDs é a geração de relatórios. Por exemplo, em sistemas de relatórios financeiros, você precisa explicar as diferenças entre os valores agregados em um relatório produzido no mês passado e aqueles na versão atual do relatório do data warehouse.

As diferentes implementações de SCDs no SQL são chamadas de "tipos". Os tipos 0 e 1, os tipos mais básicos, mantêm o controle apenas do estado original dos dados ou do estado atual dos dados, respectivamente. O tipo 2, a implementação mais comumente aplicada, cria três novos campos: validFrom, validTo e um sinalizador opcional no conjunto de dados mais recente, geralmente chamado de isValid ou isEffective.

Tipo de SCD
Descrição

Digite 0

Mantenha apenas o estado original e os dados não podem ser alterados.

Digite 1

Apenas mantenha o estado atualizado e o histórico não pode ser armazenado.

Digite 2

Manter o histórico em um novo documento.

Digite 3

Mantenha o histórico em novos campos no mesmo documento.

Digite 4

Mantenha o histórico em uma coleção separada.

Digite 6

Combinação de Tipo 2 e Tipo 3.

Você pode aplicar a estrutura SCD ao MongoDB da mesma maneira que a aplica a um banco de dados relacional. O conceito de dimensões de mudança lenta se aplica por documento no modelo de dados escolhido e otimizado para o caso de uso específico.

Considere uma collection chamada prices que armazena os preços de um conjunto de itens. Você precisa acompanhar as alterações do preço de um item ao longo do tempo para poder processar as devoluções de um item, pois o valor reembolsado deve corresponder ao preço do item no momento da compra. Cada documento na coleção tem um campo item e price :

db.prices.insertMany( [
{ 'item': 'shorts', 'price': 10 },
{ 'item': 't-shirt', 'price': 2 },
{ 'item': 'pants', 'price': 5 },
] )

Suponha que o preço das roupas mude de 5 para 7. Para rastrear essa alteração de preço, assuma os valores padrão para os campos de dados necessários para o Tipo de SCD 2. O valor padrão para validFrom é 01.01.1900, validTo é 01.01.9999 e isValid é true. Para alterar o campo price no objeto com 'item': 'pants', insira um novo documento para representar o estado atual da calca e atualize o documento válido anteriormente para não ser mais válido:

let now = new Date();
db.prices.updateOne(
{
'item': 'pants',
"$or": [
{ "isValid": false },
{ "isValid": null }
]
},
{ "$set":
{
"validFrom": new Date("1900-01-01"),
"validTo": now,
"isValid": false
}
}
);
db.prices.insertOne(
{
'item': 'pants',
'price': 7,
"validFrom": now,
"validTo": new Date("9999-01-01"),
"isValid": true
}
);

Para evitar a quebra da cadeia de validade, certifique-se de que ambas as operações de banco de dados acima ocorram no mesmo registro de data e hora. Dependendo dos requisitos do aplicação, é possível encapsular os dois comandos acima em uma transação para garantir que o MongoDB sempre aplique as duas alterações juntas. Para mais informações, consulteTransações .

A seguinte operação demonstra como fazer query do price mais recente do documento que contém o item pants:

db.prices.find( { 'item': 'pants', 'isValid': true } );

Para executar query do price do documento contendo o item pants em um ponto específico no tempo, use a seguinte operação:

let time = new Date("2022-11-16T13:00:00");
db.prices.find( {
'item': 'pants',
'validFrom': { '$lte': time },
'validTo': { '$gt': time }
} );

Se você só precisar acompanhar as alterações ao longo do tempo em alguns campos de um documento, poderá usar o tipo SCD 3 incorporando o histórico de um campo como uma array no primeiro documento.

Por exemplo, o agregação pipeline a seguir atualiza o price no documento que representa pants para 7 e armazena o valor anterior do price com um carimbo de data/hora de quando o price anterior se tornou inválido em uma array chamada priceHistory:

db.prices.aggregate( [
{ $match: { 'item': 'pants' } },
{ $addFields:
{ price: 7, priceHistory:
{ $concatArrays:
[
{ $ifNull: [ '$priceHistory', [] ] },
[ { price: "$price", time: now } ]
]
}
}
},
{ $merge:
{
into: "prices",
on: "_id",
whenMatched: "merge",
whenNotMatched: "fail"
}
}
] )

Essa solução pode se tornar lenta ou ineficiente se o tamanho do array ficar muito grande. Para evitar arrays grandes, você pode usar o outlier ou os padrões de bucket para projetar seu esquema.

Os exemplos acima se concentram em uma representação rigorosa e precisa das alterações no campo do documento . Às vezes, você pode ter requisitos menos rigorosos ao mostrar dados históricos. Por exemplo, você pode ter um aplicação que requer apenas acesso ao estado atual dos dados na maioria das vezes, mas deve executar algumas queries analíticas no histórico completo dos dados.

Nesse caso, você pode armazenar a versão atual dos dados em uma collection e as alterações históricas em outra collection. Em seguida, você pode remover a coleção histórica do cluster MongoDB ativo usando as funcionalidades do MongoDB Atlas Federated Database e, na versão totalmente gerenciada, usando o Online Archive.

Embora a alteração lenta de dimensões seja útil para o armazenamento de dados, você também pode usar a estrutura SCD em aplicativos orientados a eventos. Se você tiver eventos não frequentes em diferentes tipos de categorias, é caro encontrar o evento mais recente por categoria, pois o processo pode exigir o agrupamento ou a classificação de seus dados para encontrar o estado atual.

No caso de eventos não frequentes, é possível alterar o modelo de dados adicionando um campo para armazenar a hora do próximo evento, além da hora do evento por documento. O novo campo de data garante que, se você executar uma pesquisa para um ponto específico no tempo, poderá recuperar de forma fácil e eficiente o respectivo evento que está procurando.

Voltar

Manter versões

Nesta página