CHAVES ESTRANGEIRAS

TRTNCG 10/12/2016 12:12:53
#469581
Bom como vcs usam a questão referente a chaves estrangeiras ou como é mais usado em sistemas top de linha. Hoje uso o on restrict ou seja se tentar apagar um produto que tenha pedido indexado ele negar, ou seja, teoricamente tem que apagar primeiro pedidos que contenham este produto para somente depois apagar o produto? Essa é a melhor regra ou é melhor em cascata, ou seja se apagar o produto ele apaga também o registro do mesmo nos pedidos?
JABA 10/12/2016 15:12:02
#469582
Em caso de [Ô]Pedidos[Ô] e [Ô]Produtos[Ô], como eles são uma composição, acho que seria mais coerente usar Cascata mesmo. Se um pedido não existe mais, por que os seus itens deveriam? A relação contrária não vejo da mesma forma.
SINCLAIR 10/12/2016 16:44:54
#469583
Colegas,

Eu, particularmente, sou contra apagar em cascata. E também sou contra não apagar em cascata.

Me explico:

Se o produto, algum dia, foi usado para alguma coisa (pedido, orçamento, NFe, qualquer coisa) então ele faz parte do histórico da empresa. Se em novembro eu permitir apagar um produto, mesmo em cascata, que teve uma única venda no ano, o SPED não funcionaria mais (ou ficaria incorreto).

O que faço é ter um campo booleano, no cadastro dos produtos, que marca se o produto foi abandonado, seja por estar fora de linha de produção, seja porque não compensa mais financeiramente, seja por qual motivo for. Somente usuários com permissões especiais podem marcar produtos como inutilizáveis/fora de uso.

Quando precisar do histórico, como por exemplo, no SPED, o produto estará lá.

Quando se fala de sistema SGE, para o nível estratégico da empresa, tudo é longo prazo, para frente ou para trás. Pode-se precisar do gráfico de produtos mais vendidos nos últimos 3 meses e um produto [Ô]excluído[Ô] ainda precisa aparecer no gráfico, mesmo que tenha sido considerado como fora de linha no dia de ontem.

O mesmo faço para clientes, fornecedores, peças de composição dos produtos, qualquer outro cadastro.

Tudo de bom.
JABA 10/12/2016 22:15:14
#469587
Quando eu me refiro a exclusão do pedido, estou me referindo a exclusão física. Um pedido é composto de produtos. Um está amarrado ao outro. Se o pedido não existe mais, não vejo sentido em manter os seus itens apontando para ele, pois deixaria o banco de dados desnormalizado. Se a intenção é manter um histórico, então deveria-se optar por um campo booleano para torná-los exclusos para o sistema, como foi dito pelo SINCLAIR.
SINCLAIR 11/12/2016 08:26:38
#469592
Bom dia, Colegas,

Algumas vezes a normalização de dados bate de frente com a segurança da informação.

No meu sistema, mesmo se o camarada criou um pedido e for excluir, ainda assim fica restrito à inserção de campo booleano definindo como excluído e não excluindo fisicamente.

O motivo é simples: mesmo que neste caso não se vá precisar de histórico (o que sempre mantenho) mas é necessário não permitir a saída de um produto acabado (já extrusado, laminado, montado, pintado) sem um pedido com código de barras.

Alguém poderia fazer o pedido, sair com um lote de mercadorias, voltar e excluir fisicamente o pedido. Por isto eu mantenho o pedido apenas marcado como inservível e não excluo permanentemente, de forma física. No pedido fica o nome, data e hora de quem fez e deverá se explicar, posteriormente, porque o fez e excluiu.

No caso de contas a receber e a pagar, quando excluídas, além de funcionar da mesma forma (campo booleano marcando que foi considerada inutilizável), um aviso vai para a agenda compartilhada do chefe do setor. Se excluir uma conta, o chefe saberá. E se o chefe não marcar na agenda que analisou o caso, o diretor saberá.

Enfim, não só por histórico, mas por segurança da informação também.

Tudo de bom.
KERPLUNK 11/12/2016 10:35:25
#469594
Resposta escolhida
Isso é bastante relativo. Tem casos em que a deleção em cascata é necessária/desejada e outros em que não. A estratégia de banco de dados vai depender do regime adotado pelo cliente. A maioria opta por manter os registros. Mas como disse, é caso à caso. Já tive situações em que tive que fazer um [Ô]caçador de registros órfãos[Ô] para organizar melhor o banco.
JABA 11/12/2016 13:02:57
#469608
Acho que compreendi agora a dúvida do colega TRTNCG. Eu estava pensando que ele estava se referindo aos itens que compõe o pedido, e não à entidade Produto. Se for para a exclusão da entidade Produto, na minha opinião você deve usar o Restrict mesmo, pois se o produto não tiver mais relação com nenhuma outra tabela, sua exclusão não afetará absolutamente nada. Seria a mesma coisa de você cadastrar um novo produto agora e excluí-lo em seguida.
TRTNCG 11/12/2016 13:10:10
#469609
Citação:

:
Acho que compreendi agora a dúvida do colega TRTNCG. Eu estava pensando que ele estava se referindo aos itens que compõe o pedido, e não à entidade Produto. Se for para a exclusão da entidade Produto, na minha opinião você deve usar o Restrict mesmo, pois se o produto não tiver mais relação com nenhuma outra tabela, sua exclusão não afetará absolutamente nada. Seria a mesma coisa de você cadastrar um novo produto agora e excluí-lo em seguida.



Isso JABA meu sistema já funciona assim, mas, a troca de ideias com amigos que também estão na labuta todos os dias é de enorme importância para que possamos trabalhar e deixar tudo certiho
JABA 11/12/2016 13:15:41
#469610
Citação:

Isso JABA meu sistema já funciona assim, mas, a troca de ideias com amigos que também estão na labuta todos os dias é de enorme importância para que possamos trabalhar e deixar tudo certiho



Demorou, mas eu consegui.
TRTNCG 11/12/2016 13:32:25
#469613
Tópico encerrado , respostas não são mais permitidas