Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

PKs em Tabelas Fato

Marina,

Só mais uma dúvida, com relação a chave primária de uma tabela fato, que são todas as FKs relacionadas com as dimensões, certo? e que juntas viram chave primária na Fato, se eu tiver um caso que os campos juntos possam se repetir no meu banco OLTP quando eu for carregar a fato vai dá erro de constraint primary key... , concorda? Então como devo proceder?

Estava pensando em criar uma chave primária do tipo inteiro e auto incremento, ai os outros campos continuariam FKs das dimensões, e a repetição na tabela fato poderia ser feita, seria assim a solução correta? Andei vendo algo sobre Surrogate Key, seria isso?

4 respostas

Oi Emiliano!

Desculpa, não sei se entendi direito a sua dúvida. Mas vou esclarecer alguns conceitos, e você me avisa se é por aí o que gostaria de saber.

=)

A chave primária é uma configuração que criamos quando queremos que aquele valor sirva como index, ou seja, quando queremos que não permita valores nulos ou repetidos.

A chave primária pode ser uma "Natural Key" ou "Surrogate Key".

Natural Key, é uma coluna que já existe na tabela, de um valor de negócio que pode servir como chave primária.

Se for uma tabela de usuários de um banco por exemplo, podemos usar o número de conta corrente como index, pois não repetirá valores, nem terá um valor nulo, pois todo usuário do banco tem uma conta. Sendo assim o número da conta atuaria como natural key, e podemos ou não torná-la a primary key de nossa tabela.

Surrogate Key é uma coluna com um número criado, sem valor relevante para seu negócio, que pode servir como primary key pois se trata de um índice criado especialmente para isso.

No nosso caso do curso por exemplo, a maioria de nossos códigos já podem ser considerados surrogate keys, pois se você verificar nas consultas, verá que são números ordenados e criados artificialmente, que não significam nada para nosso negócio. (Ex: Em Cod_Fabrica temos 001, 002, 003)

Criamos uma chave estrangeira quando queremos fazer uma relação entre tabelas, ou seja, relacionamos a chave primária de uma tabela, com versão dela mesma em outra tabela.

Nossas tabelas fato então, ficam sim com mais de uma chave primária, pois elas na verdade são chaves primárias de outras tabelas.

Acho que talvez tenha uma confusão acontecendo quando você diz que uma chave "não pode repetir".

Quando estamos fazendo uma consulta, a mesma chave primária aparecerá várias vezes, pois ela pode fazer muitas relações com valores de outras colunas.

O que ela não pode, é guardar o mesmo valor mais de uma vez na tabela original do banco de dados, ou guardar um valor nulo.

Por exemplo, ao consultar a Fato 001, olhando os dados sobre as minhas fábricas, podemos ver que seus valores repetirão, pois terei vários produtos que se relacionam com aquela fábrica. O mesmo ocorre com a repetição de clientes.

O que não pode acontecer:

  • Ter um valor nulo ali, pois todo produto e cliente terá um fábrica.

  • Um mesmo código se referir a fábricas diferentes.

Sobre a repetição da combinação de todas as primary keys juntas, acredito que conceitualmente, o banco é pensado segundo seu modelo de negócio para que isso não aconteça. Pode ver que em nenhuma das nossas fatos isso acontece, pois a lógica do negócio não permite.

O cuidado está na formatação dos dados quando carregados. Por exemplo, não faz sentido carregar duas vezes dados sobre o mesmo cliente, na compro do mesmo produto, que vem da mesma fábrica, no mesmo dia concorda? Se tudo foi elaborado com boas práticas, todos os indicadores viriam iguais! A linha inteira viria duplicada, e não queremos isso!

Sua dúvida tinha algo a ver com esses conceitos? Pode me falar mais sobre esse erro? É um erro que aconteceu com você? Ou é uma dúvida sobre um possível erro?

Desculpe a extensão da resposta, espero que ajude!

Marina,

O que acontece é que em uma tabela Fato que fiz, todos os campos FKs dessa fato que referenciam as dimensões, juntos viraram uma PK da fato, ok? Só que esses campos juntos podem se repetir, pois a Natural Key que é a minha chave da minha tabela no meu banco OLTP, não está como chave da tabela Fato.

Então pergunto, como solucionar isso?

01) Coloco uma Surrogate Key?

02) Coloca o campo chave (Natural Key) da tabela do meu banco OLTP, dentro da PK da fato, junto com outros campos que já são chave?

03) Deixo somente a Natural Key como chave da fato?

Deu pra entender?

solução!

Emiliano,

Olha, não entendo muito de OLTP, mas posso te orientar um pouco mais sobre como fazer isso segundo o modelo ensinado pelo professor para criar tabelas fato:

Vamos falar em termos de dimensões. Para tal, acredito que não importa muito se a chave é natural ou surrogate.

O importante é que todos as chaves primárias da fato precisam ser também as chaves primárias das tabelas com o qual tem relações(FKs).

Essa natural key que você menciona portanto, precisa ser chave primária tanto da tabela de origem dela(tabela dimensão), como da fato (uma vez que você pretende configurar uma relação estrangeira entre as duas (FK).

Além disso colocaria ela em primeiro lugar, para servir como referência para as outras.

Portanto acredito que seja a opção número 2. Ela será uma chave primária, junto com as outras.

Ah certo! Marina Obrigado!!