Oi MatheusLima,  o que o joanse está correto. Em muitas aplicações os valores são copiados quando uma venda é feita para garantir a consistência de dados no momento da venda. Portanto, guardar apenas chaves estrangeiras (foreign keys) de outras tabelas não é o suficiente porque se os dados do produto mudarem acabam interferindo com os dados da venda.

Contudo, existem outras aplicações onde produtos com atributos diferentes acabam se tornando produtos distintos chamados variantes. Por exemplo, um camiseta da cor azul e tamanho médio é considerado um produto e a mesma camiseta da cor vermelha e de tamanho também médio é outro produto distinto; ambos têm a mesma identificação de variante portanto a aplicação sabe que são variações do mesmo produto. Combinado a isso, os produtos são imutáveis, para  atualizar um produto teríamos que na verdade fazer uma cópia do existente com a modificação desejada e nunca apagar o original (apenas marcar como apagado mais ainda existente no banco de dados). Em aplicações que usam estes dois conceitos (variantes + imutabilidade) teria sim como guardar apenas as identificações de produto e o preço atual quando a venda é feita. Porém, acho que a sua aplicação não tem estes conceitos.

Recomendo dar uma olhada como alguns bancos de dados de ecommerce funcionam porque é um assunto muito interessante. Ou pesquise sobre SKU e variantes de produtos.

abrs

Sim, pretendo não excluir um produto depois de cadastrado, pretendo marcar como inativo caso queira excluir