Nota e Chave estrageira

Estou desenvolvendo um sistema web e surgiu a seguinte dúvida.

Tenho uma tabela de trabalhos realizados. Esta tabela deve conter entre outros dados o serviço realizado (que é uma entidade).

Na tabela serviço tenho o valor do mesmo.

Se eu utilizar uma chave estrangeira e após algum tempo o valor mudar, o valor do trabalho realizado vai mudar também.

Qual a solução para este problema? Devo deixar a tabela serviços realizados sem chaves estrangeiras?

Não mudar a chave estrangeira. Por que você a mudaria?

Todos os bancos oferecem opções para você configurar o relacionamento para propagar a mudança (UPDATE) de chave do pai nos filhos.

A mesma coisa para delete, você pode informar para apagar automaticamente os registros filhos se o pai sofrer um DELETE.

Veja as operações oferecidas para constraint do seu banco de dados.

wiliamps

Acho que me expressei mal.

O valor da chave não muda, o que muda é o valor do serviço.

Como as entidades são ligadas através da chave e vou utilizar o inner join para fazer o select, o valor da nota mudará também certo?

Vamos supor que a nota possui o serviço de ID 1.

se o valor do serviço do ID 1 mudar a nota vai ser alterada.

Não quero que a nota mude.

Mas só vai mudar se você quiser. O.o
Imagine.

Pessoa tem Cachorro.

Se eu mudar o nome do cachorro, o valor da chave não tem que mudar.

Crie outro campo NOTA para essa tabela, oras…

Isso acontece com Controle de Estoque tambem,
vc nao deve relacionar o valor do produto da tabela produtos com o pedido, vc pode dizer PQ ?
pq vai acontecer isso.

Image só, fiz uma venda com o valor de R$ 50,00, mas depois quero abaixar o valor do produto para R$ 40,00.
O valor do produto vendido nao pode ser 40 pois vendi por 50.

Entao pra vc arrumar, vc cria outro campo sem relacionamento algum…

;]

Bom vou tentar explicar de outra maneira.

Tenho a tabela serviço

ID - Descrição - Valor
1 - serv-1 - 50,00
2 - serv-2 - 30,00
3 - serv-3 - 20,00
4 - serv-4 - 60,00

Tabela NOTA

ID ID_SERVICO(FK) DATA
1 - 1 - 02/05/2012
2 - 3 - 25/10/2012
3 - 4 - 29/05/2012
4 - 3 - 22/03/2012

Bom se eu quiser fazer um select que contenha id.nota, data.nota, id.servico, descricao.servico, valor.servico ele vai pegar os valores (preços) ATUAIS do serviço.

Caso este valor(preço) mude, o valor(preço) da nota vai ser diferente do valor(preço) cobrado quando ela foi lançada.

Sendo assim como faço para resolver? Devo não usar chave estrangeira?

guarda os dados em uma tabela estatica ou cria um campo estatico, pq tem dados q são dinamicos, entao vai acontecer isso ai…

[quote=charleston10]guarda os dados em uma tabela estatica ou cria um campo estatico, pq tem dados q são dinamicos, entao vai acontecer isso ai…

[/quote]

Pensei em fazer isto, porém queria saber se esta era realmente a melhor solução.

Obrigado.

Depende do que tu queres ter.

Por exemplo, queres saber daqui a algum tempo qual era o preço de determinado serviço no dia X?
Todos os serviços de um determinado tipo efetuados num determinado dia têm o mesmo preço?

Uma possível solução será:

Tabela Serviço
Id
Descrição

Tabela Serviço_Valor
Id_Serviço
Data_Inicio
Data_Fim

Tabela Nota
Id
Id_Serviço
Data

Neste caso, relacionando a nota com as duas tabelas anteriores consegues ter sempre o valor correto do serviço em determinada data.