| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/07/2005 22:58:41
|
Thiago Senna
GUJ Master
![[Avatar]](/images/avatar/78719f11fa2df9917de3110133506521.jpg)
Membro desde: 11/02/2005 08:08:02
Mensagens: 1595
Offline
|
Olá GUJ's.....
Estou criando um DAO chamado ServicoPrestadoDAO, e me surgiu uma dúvida. Na base de dados a tabela ServicoPrestado tem um relacionamento com a tabela empresa à partir do CNPJ. Por isso criei o FK usando o ALTER TABLE. A minha dúvida inicial é a seguinte:
Quando eu for criar um novo serviço prestado e passar um cnpj de uma empresa que não existe no meu banco será lançado uma exceção? Ou seja, o banco de dados deve barrar a entrada deste registro ou não? Será que eu terei que implementar esta consistência no próprio código do DAO?
Bom, eu fiz alguns testes, e parece que vou ter que fazer esta consistência no DAO mesmo, mas acho q o banco deveria cuidar disso, e não meu DAO. Fica muito deselegante e vai poluir muito meu código. Será que estou fazendo algo errado, o MySQL não suporte isso ou nenhum banco suporta?
O Script SQL segue abaixo:
Desde já agradeço!
Thiago Senna
This message was edited 1 time. Last update was at 08/07/2005 23:07:20
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/07/2005 23:06:16
|
Mauricio Linhares
Moderador
![[Avatar]](/images/avatar/97af07a14cacba681feacf3012730892.jpg)
Membro desde: 09/01/2005 23:28:22
Mensagens: 3717
Localização: João Pessoa, Paraíba - Brasil
Offline
|
O MySQL normalmente não faz esse tipo de testes (porque as tabelas são, por default, MyISAM, que ainda não suporta isso), mas usando tabelas InnoDB (as que você está usando) e criando os índices manualmente você consegue fazer o banco lidar com isso normalmente. Use uma ferramenta, como o DbDesigner ou vá lá na documentação ver como declarar a criação de índices.
Mas porque você não pode fazer isso no seu Dao? Vai ser só uma linha, pra ver se a propriedade empresa está null, não?
|
Meu blog sobre desenvolvimento | My Last.fm | @mauriciojr
Screencast de Introdução a linguagem Objective-C |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/07/2005 23:23:05
|
Thiago Senna
GUJ Master
![[Avatar]](/images/avatar/78719f11fa2df9917de3110133506521.jpg)
Membro desde: 11/02/2005 08:08:02
Mensagens: 1595
Offline
|
Olá Maurício
Maurício Linhares wrote:e criando os índices manualmente você consegue fazer o banco lidar com isso normalmente
Humm.. pelo jeito naum venho mechendo com isso... Vou seguir seu conselho! Nem sei o que é índice! Mas já fico contente em saber que o banco pode cuidar disso pra mim!
Maurício Linhares wrote:Use uma ferramenta, como o DbDesigner ou vá lá na documentação ver como declarar a criação de índices.
Mas porque você não pode fazer isso no seu Dao? Vai ser só uma linha, pra ver se a propriedade empresa está null, não?
Só verificar se está nulo? Bom, o que pretendo garantir é que a empresa exista no banco, entaum eu precisaria de algo do tipo
É, até que é pequeno, até que posso colocar isso no dao numa boa... mas particularmente prefiro que o banco faça isso.
Valeu Maurício.. Com essas suas colocações já deu pra ajudar bastante!
Thiago Senna
This message was edited 1 time. Last update was at 08/07/2005 23:23:38
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/07/2005 00:20:43
|
Mauricio Linhares
Moderador
![[Avatar]](/images/avatar/97af07a14cacba681feacf3012730892.jpg)
Membro desde: 09/01/2005 23:28:22
Mensagens: 3717
Localização: João Pessoa, Paraíba - Brasil
Offline
|
Índice
Foreign Keys no MySQL
Referência do InnoDB
No caso da validação do Dao, eu acho que o "ServiçoPrestado" nem deveria chegar no Dao se já não tivesse uma empresa nele, ele já deveria ter sido validado antes disso, o seu Dao deve receber tudo limpinho e bonitinho. Pelo que você falou, ter uma empresa em um "ServiçoPrestado" parece ser uma regra de negócio, se é regra de negócio, deveria ter sido validado na camada de negócio, não no Dao ou no banco de dados.
|
Meu blog sobre desenvolvimento | My Last.fm | @mauriciojr
Screencast de Introdução a linguagem Objective-C |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/07/2005 19:17:56
|
Thiago Senna
GUJ Master
![[Avatar]](/images/avatar/78719f11fa2df9917de3110133506521.jpg)
Membro desde: 11/02/2005 08:08:02
Mensagens: 1595
Offline
|
Olá!
Maurício Linhares wrote:ter uma empresa em um "ServiçoPrestado" parece ser uma regra de negócio, se é regra de negócio, deveria ter sido validado na camada de negócio, não no Dao ou no banco de dados.
Realmente Maurício, é uma lógica de negócio. No meu modelo nem sei se devo chamar esta relação entre empresa e serviço prestado como relacionamento.
Na verdade eu tenho um ServiçoPrestado que possui uma empresa cliente ( a qual contratou o serviço). O relacionamento no meu modelo acontece entre a empresa e o serviço prestado através da empresa que forneceu o serviço.
Bom... deixe-me ser mais direto e encher menos linguiça!
A classe empresa possui uma coleção de serviços prestados, e dentro da classe serviços prestados possuir uma referência para a empresa que contratou o serviço.
O que eu quero garantir é que serviço prestado não seja persistido caso a empresa que contratou o serviço não exista na base de dados, e não o caso desta empresa que cadastrou o serviço estar nula. É quanto a este tipo de responsabilidade é que quero saber se o BD garante pra mim com a Foreign Key.
Maurício,
Já baixei o DBDesigner, e já vi que vai valer a pena. Também vou estudar os links que você me indicou. Com a ajuda que q você deu já deu para me orientar e por isso vou continuar com o MySQL mesmo no meu projeto de final de curso.
Observação:
Pena que tabelas do tio MyISAM não suportam o relacionamento ainda. Seria muito bom usá-las para rodar os testes unitários, já que são mais rápidas.
Abraços!
Thiago Senna
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/07/2005 19:41:34
|
pcalcado
Moderador
![[Avatar]](/images/avatar/110eec23201d80e40d0c4a48954e2ff5.jpg)
Membro desde: 08/03/2004 17:19:35
Mensagens: 5174
Localização: Sydney - Australia
Offline
|
Thiago,
Em que hipotese voce teria um CNPJ invalido? Voce esta pegando o que o usuario digitou e colocando como foreign key?
Se não, não teria, num caso normal, você ter um CNPJ invalido, ja que ele viria de uma lsita
Se sim, voce tem que fazer essa validação quando o usuario inserir o dado, se nao estiver cadastrado rejeite, ou cadastre, sei la
[]s
Shoes, que esta de 10 ate as 19:40 de um sabado, mesmo nas ferias que começaram ontem, corrigindo problemas em MALDITOS DAOS
|
Phillip Calçado "Shoes"
http://fragmental.tw/
http://blog.fragmental.com.br/
"It is unfortunate that much of what is called 'object-oriented programming today is simply old style programming with fancier constructs." - Alan Kay |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/07/2005 19:47:23
|
Mauricio Linhares
Moderador
![[Avatar]](/images/avatar/97af07a14cacba681feacf3012730892.jpg)
Membro desde: 09/01/2005 23:28:22
Mensagens: 3717
Localização: João Pessoa, Paraíba - Brasil
Offline
|
pcalcado wrote:
Shoes, que esta de 10 ate as 19:40 de um sabado, mesmo nas ferias que começaram ontem, corrigindo problemas em MALDITOS DAOS
Na boa Shoes, eu tava lutando pra fazer o Commons Validator funcionar no Spring, mas vou pegar um cineminha pra descansar, ninguém merece...
Vai dar um passeio também, eu espero que funcione pra mim
|
Meu blog sobre desenvolvimento | My Last.fm | @mauriciojr
Screencast de Introdução a linguagem Objective-C |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/07/2005 22:00:37
|
Thiago Senna
GUJ Master
![[Avatar]](/images/avatar/78719f11fa2df9917de3110133506521.jpg)
Membro desde: 11/02/2005 08:08:02
Mensagens: 1595
Offline
|
Olá!
Philip wrote: Shoes, que esta de 10 ate as 19:40 de um sabado, mesmo nas ferias que começaram ontem, corrigindo problemas em MALDITOS DAOS
Maurício wrote: Na boa Shoes, eu tava lutando pra fazer o Commons Validator funcionar no Spring, mas vou pegar um cineminha pra descansar, ninguém merece...
Eu wrote:To de férias da faculdade e estou fazendo o trabalho de final de curso. Comecei as 10:00 e fui até as 17:50. Recomecei o trabalho às 21:00. Estou tentando prever coisas que nunca irão acontecer.
Mudando de assunto...
Philip wrote: Se não, não teria, num caso normal, você ter um CNPJ invalido, ja que ele viria de uma lsita
Humm... Verdade... Essa é aquela maldita mania que assombra todo programdor, que é ficar evitando possibilidades que nunca acontecerão!
Abraços!
Thiago Senna
This message was edited 2 times. Last update was at 09/07/2005 22:02:20
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/07/2005 09:50:51
|
renatosilva
GUJ Master
Membro desde: 16/12/2004 17:09:19
Mensagens: 1787
Offline
|
Maurício,
Obrigado pela informação sobre o InnoDB, temos uma aplicação cujo banco já estávamos pensando em mudar para PostgreSQL por que não conseguíamos criar chaves estrangeiras no MySQL. Só uma pergunta: que impactos eu teria se mudar o bd de MyISAM para InnoDB? Resumidamente você saberia as diferenças? Os perigos? Meu colega tá tentando já converter o banco, mas não tá funfando...
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/07/2005 09:54:28
|
Mauricio Linhares
Moderador
![[Avatar]](/images/avatar/97af07a14cacba681feacf3012730892.jpg)
Membro desde: 09/01/2005 23:28:22
Mensagens: 3717
Localização: João Pessoa, Paraíba - Brasil
Offline
|
A única diferença é que o InnoDB garante mesmo a integridade referêncial por chaves estrangeiras, o que pode estar causando problemas no seu sistema, pode ter alguma coisa que está "quebrando" a integridade dele.
Se você já tem um sistema que roda normalmente com MyISAM, continue usando ele, porque ele é bem mais rápido que o InnoDB, se ainda tá começando, faça tudo em InnoDB.
|
Meu blog sobre desenvolvimento | My Last.fm | @mauriciojr
Screencast de Introdução a linguagem Objective-C |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/07/2005 10:13:26
|
renatosilva
GUJ Master
Membro desde: 16/12/2004 17:09:19
Mensagens: 1787
Offline
|
O sistema tá funfando, mas temos que escolher o banco. Meu colega acabou de informar que conseguiu converter. Não dá pra usar MyISAM porque acho muito necessário que o banco possua integrigade referencial, tornando-o muito mais consistente. Valeu! Obrigado!
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/07/2005 10:30:14
|
renatosilva
GUJ Master
Membro desde: 16/12/2004 17:09:19
Mensagens: 1787
Offline
|
Aliás, foi tu que escreveu o tutorial do Hibernate 3? Li uma parte em casa, tá legalzinho, parabéns!
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/07/2005 10:41:21
|
Mauricio Linhares
Moderador
![[Avatar]](/images/avatar/97af07a14cacba681feacf3012730892.jpg)
Membro desde: 09/01/2005 23:28:22
Mensagens: 3717
Localização: João Pessoa, Paraíba - Brasil
Offline
|
renato3110 wrote:Aliás, foi tu que escreveu o tutorial do Hibernate 3? Li uma parte em casa, tá legalzinho, parabéns!
Valeu
|
Meu blog sobre desenvolvimento | My Last.fm | @mauriciojr
Screencast de Introdução a linguagem Objective-C |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/07/2005 11:02:42
|
Thiago Senna
GUJ Master
![[Avatar]](/images/avatar/78719f11fa2df9917de3110133506521.jpg)
Membro desde: 11/02/2005 08:08:02
Mensagens: 1595
Offline
|
Olá Renato,
Quando mudei minha base para InnoDB, uma coisa que me deu uma dor de cabeça e tanto é que nos meus testes unitários haviam um comando truncat nas minhas tabelas.
tipo
Esse comando não pode ser usando em tabelas do tipo InnoDB, ou pelo menos, naum pode ser usado durante uma transação!
Abraços!
Thiago Senna
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/07/2005 14:26:29
|
renatosilva
GUJ Master
Membro desde: 16/12/2004 17:09:19
Mensagens: 1787
Offline
|
Obrigado Thiago pela dica. Vou ficar de olho pra ver se esse InnoDB vai se comportar bem hehe. Pelo menos até agora tá legalzinho. O que seria esse truncate? É um comando SQL?
Um problema que já verifiquei e que pode ser por causa da migração para InnoDB é que o MS Access dá um erro fatal quando eu tento exportar tabelas para o MySQL via ODBC, o que antes não acontecia.
|
|
|
 |
|
|