Um banco de dados multidimensional é frequentemente usado em análise OLAP (Online Analytical Processing) sendo orientado por dimensões, e não por tabelas isoladas como no modelo relacional puro. Nesse contexto, considere uma instância relacionada às vendas de uma loja de varejo. As dimensões, nesse caso, poderiam ser:
1. Tempo: Dias, Meses, Trimestres, Anos 2. Produto: ID do Produto, Nome do Produto, Categoria 3. Localização: Cidade, Estado, País 4. Vendedor: ID do Vendedor, Nome, Departamento
Esse banco de dados multidimensional pode ser visualizado como um “cubo” com quatro dimensões, onde cada dimensão forma um dos eixos. Os pontos dentro desse “cubo” representam valores específicos de medidas, como é o caso do total de vendas. Esses pontos podem também representar algo mais complexo envolvendo muitas dimensões como, por exemplo, as vendas do Produto P no Estado Q durante o Mês R por Vendedor S.
Muitas vezes esses “cubos” são implementados em bancos de dados relacionais convencionais, de modo que os usuários possam usar linguagens amplamente conhecidas, como é o caso da linguagem de consultas SQL. Para isso, é necessário modelar tabelas de dimensão e de fato:
1. DimensaoTempo: com colunas tais como TempoID, Mes, Ano
2. DimensaoProduto: com colunas tais como ProdutoID, NomeProduto, Categoria
3. DimensaoLocalizacao: com colunas tais como LocalizacaoID, Cidade, Estado, País
4. FatoVendas: com colunas tais como TempoID, ProdutoID, LocalizacaoID, TotalVendas
Com base nas tabelas deste esquema relacional em particular, que representam um banco de dados multidimensional, considere que se deseja fazer a seguinte consulta de tipo “slice and dice”:
“Quanto foi vendido em termos de valor total nas categorias ‘Eletrônicos’ e ‘Roupas’ no estado de ‘Pernambuco’ durante o ano de 2022?”
A expressão SQL que responde a essa consulta é
-
A SELECT p.Categoria, SUM(f.TotalVendas) FROM FatoVendas f WHERE f.ProdutoID IN ('Eletrônicos', 'Roupas') AND f.TempoID = '2022' AND f.LocalizacaoID = 'Pernambuco' GROUP BY p.Categoria;
-
B SELECT p.Categoria, SUM(TotalVendas) AS VendasTotais FROM FatoVendas f JOIN DimensaoTempo t ON f.TempoID = t.TempoID WHERE p.Categoria IN ('Eletrônicos', 'Roupas') AND t.Ano = 2022 AND l.Estado = 'Pernambuco' GROUP BY p.Categoria;
-
C SELECT p.Categoria, COUNT(f.TotalVendas) AS VendasTotais FROM FatoVendas f JOIN DimensaoProduto p ON f.ProdutoID = p.ProdutoID JOIN DimensaoLocalizacao l ON f.LocalizacaoID = l.LocalizacaoID WHERE (p.Categoria = 'Eletrônicos' OR p.Categoria = 'Roupas') AND l.Estado = 'Pernambuco' GROUP BY p.Categoria;
-
D SELECT p.Categoria, SUM(f.TotalVendas) AS VendasTotais FROM FatoVendas f JOIN DimensaoTempo t ON f.TempoID = t.TempoID JOIN DimensaoProduto p ON f.ProdutoID = p.ProdutoID JOIN DimensaoLocalizacao l ON f.LocalizacaoID = l.LocalizacaoID WHERE (p.Categoria = 'Eletrônicos' OR p.Categoria = 'Roupas') AND t.Ano = 2022 AND l.Estado = 'Pernambuco' GROUP BY p.Categoria;
-
E SELECT p.Categoria, SUM(f.TotalVendas) FROM FatoVendas f JOIN DimensaoProduto p ON f.ProdutoID = p.ProdutoID WHERE (p.Categoria = 'Eletrônicos' OR p.Categoria = 'Roupas') AND f.TempoID = (SELECT TempoID FROM DimensaoTempo WHERE Ano = '2022') GROUP BY p.Categoria;