Isso é para responder a parte:
Eu estava tentando entender se as tabelas de dimensão podem ser tabelas de fatos também ou não.
A resposta curta (INMO) é Não. Isso ocorre porque os 2 tipos de tabelas são criados por motivos diferentes. No entanto, de uma perspectiva de design de banco de dados, uma tabela de dimensão poderia ter uma tabela pai como o caso da tabela de fatos que sempre tem uma tabela de dimensão (ou mais) como pai. Além disso, as tabelas de fatos podem ser agregadas, enquanto as tabelas de dimensão não são agregadas. Outro motivo é que as tabelas de fatos não devem ser atualizadas no local, enquanto as tabelas de dimensão podem ser atualizadas no local em alguns casos.
Mais detalhes:
As tabelas de fatos e dimensões aparecem em um esquema comumente conhecido como Star Schema. O objetivo principal do esquema em estrela é simplificar um conjunto complexo de tabelas normalizadas e consolidar dados (possivelmente de sistemas diferentes) em uma estrutura de banco de dados que pode ser consultada de maneira muito eficiente.
Em sua forma mais simples, ele contém uma tabela de fatos (Exemplo: StoreSales) e uma ou mais tabelas de dimensão. Cada entrada de dimensão tem 0,1 ou mais tabelas de fatos associadas a ela (exemplo de tabelas de dimensão: geografia, item, fornecedor, cliente, tempo, etc.). Seria válido também que a dimensão tivesse um pai, caso em que o modelo seria do tipo "Floco de neve". No entanto, os designers tentam evitar esse tipo de design, pois ele causa mais junções que reduzem o desempenho. No exemplo de StoreSales, a dimensão Geografia pode ser composta pelas colunas (GeoID, ContenentName, CountryName, StateProvName, CityName, StartDate, EndDate)
Em um modelo Snow Flakes, você poderia ter 2 tabelas normalizadas para informações geográficas, a saber: Tabela de conteúdo, Tabela de país.
Você pode encontrar muitos exemplos no Star Schema. Além disso, verifique isso para ver uma visão alternativa no modelo de esquema em estrela Inmon vs. Kimball . Kimbal tem um bom fórum que você também pode querer conferir aqui: Fórum Kimball .
Edit: Para responder a comentários sobre exemplos para 4NF:
- Exemplo de uma tabela de fatos que viola 4NF:
Fato de vendas (ID, BranchID, SalesPersonID, ItemID, Amount, TimeID)
- Exemplo para uma tabela de fatos que não viola 4NF:
AggregatedSales (BranchID, TotalAmount)
Aqui a relação está em 4NF
O último exemplo é bastante incomum.