| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/09/2011 20:36:16
|
MWAdriano
JavaChild
Membro desde: 06/07/2009 13:45:16
Mensagens: 119
Localização: Americana-SP
Offline
|
Desculpem se estou tentando abrir um assunto que já tenha sido muito discutido e eu não saiba. Se esse for o caso, peço que uma alma caridosa me indique o link para a discussão, pois preciso muito estudar isso, urgente.
No meu ponto de vista esse é um assunto muito relevante para quem vai desenvolver um sistema, seja ele qual for. Quero falar sobre a estratégia utilizada para se criar entidades em um modelo de domínio. Pelo que eu saiba, salvo grotesco engano, devemos trabalhar para tirar o máximo de proveito dos recursos de OO para fazer com que as entidades representem o domínio do negócio de forma mais próxima da realidade possível. Pois bem, caso eu esteja enganado, peço que alguém me corrija. Mas se isso representa a verdade, vou apresentar o seguinte senário, onde tenho entidade Systemuser, que representa um usuário do sistema e tenho as entidades Employee, Customer e Vendor. No meu entendimento, todos essas entidades estenderiam direta ou indiretamente de uma entidade Person, pois no mundo real elas representam a entidade (pessoa), apenas com caracterísitcas a mais. Por exemplo, um cliente e um fornecedor são pessoas. O funcionário também, mas podemos considerar que o usuário do sistema, por sua vez, é um funcionário.
Acredito que nessas situações mencionadas acima, a herança representaria muito melhor o mundo real do que o encapsulamento e convido os amigos a pensarem comigo. É diferente dizer que um funcionário é uma pessoa e dizer que um carro tem um motor. O encapsulamento representa muito melhor o segundo cenário.
Quando a chave primária de uma tabela é uma chave estrangeira apontada para a chave primária de outra tabela, entende-se automaticamente que uma entidade é uma extensão da outra. E não consigo imaginar diferente, a menos que haja uma mudança de conseito que eu não esteja entendendo.
Todavia, ferramentas IDE de criação automática de entidades através de JPA, como Netbeans ou Eclipse, quando solicitado para gerar entidades automaticamente com base em um banco já existente, o mesmo não cria as entidades extendendo uma das outras. Ele cria como objetos encapsulados em atributos. Alguém saberia dizer porque?
E se meu raciocínio está errado, alguém poderia me ajudar a ver isso?
Grato.
|
----------------------------------------------
Adriano da Silva.
Trabalho com:
Java - NetBeans 6.9 - Swing/AWT/JDBC
PostGres
Windows e Linux(iniciante). |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/09/2011 21:40:33
|
edsonmartins
Thread.start()
![[Avatar]](/images/avatar/27626c51d02255329907f7f68d9f8f59.png)
Membro desde: 09/09/2011 09:09:48
Mensagens: 25
Localização: Araruna-PR
Offline
|
Boa noite,
Simplesmente ferramentas de engenharia reversa não conseguem criar heranças pois isso na está representando dessa forma no banco de dados já que isso não existe para o mesmo. O que as ferramentas poderiam fazer é permitir que usuário interagisse no momento da importação e permitisse informar as possíveis heranças.
Edson Martins
|
Você só entende um assunto completamente, depois que conseguir explicar com clareza. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/09/2011 06:32:08
|
MWAdriano
JavaChild
Membro desde: 06/07/2009 13:45:16
Mensagens: 119
Localização: Americana-SP
Offline
|
Pois eh Edson. Eu imagino que seria isso também.. Acho que isso deveria estar nas ferramentas porque imagino que pelo menos em 90% dos casos em que uma tabela tenha como sua chave primária uma chave estrangeira importada da chave primária de uma outra tabela, ela será extendida desta tabela.. Não consigo imaginar outra hipotese. Então a ferramenta deveria detectar isso e dar essa opção para você escolher no momento da importação. Mas na minha visão isso é muito óbvio! Vc saberia dizer porque isso não está implementado? Ou se está, onde está?
This message was edited 1 time. Last update was at 16/09/2011 06:34:36
|
----------------------------------------------
Adriano da Silva.
Trabalho com:
Java - NetBeans 6.9 - Swing/AWT/JDBC
PostGres
Windows e Linux(iniciante). |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 17/09/2011 11:20:07
|
moscoso.dev
Debugger
Membro desde: 06/07/2011 07:03:19
Mensagens: 66
Offline
|
Todavia, ferramentas IDE de criação automática de entidades através de JPA, como Netbeans ou Eclipse, quando solicitado para gerar entidades automaticamente com base em um banco já existente, o mesmo não cria as entidades extendendo uma das outras. Ele cria como objetos encapsulados em atributos. Alguém saberia dizer porque?
Porque ferramentas ORM foram feitas para outra coisa, gerar as tabelas automaticamente baseado no modelo de objetos.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 17/09/2011 11:36:17
|
MWAdriano
JavaChild
Membro desde: 06/07/2009 13:45:16
Mensagens: 119
Localização: Americana-SP
Offline
|
Mas desde que ela se propõe a fazer o inverso, deveria fazer de forma mais coerente, eu acho.. Poderia ao menos dar opção no momento da importação para você interagir e indicar que no lugar de encapsular, você quer herança. Eu não vejo de outra forma. Uma tabela cuja sua PK é FK da PK de outra tabela... Não vejo outra alternativa coerente a não ser herança. Neste formato, desde que o banco esteja bem modelado, digo, seria até um desafio encontrar uma situação que não represente uma herança. Se alguém souber seria legal chutar a bola pra gente!
|
----------------------------------------------
Adriano da Silva.
Trabalho com:
Java - NetBeans 6.9 - Swing/AWT/JDBC
PostGres
Windows e Linux(iniciante). |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 17/09/2011 12:12:33
|
moscoso.dev
Debugger
Membro desde: 06/07/2011 07:03:19
Mensagens: 66
Offline
|
MWAdriano wrote:Mas desde que ela se propõe a fazer o inverso, deveria fazer de forma mais coerente, eu acho.. Poderia ao menos dar opção no momento da importação para você interagir e indicar que no lugar de encapsular, você quer herança. Eu não vejo de outra forma. Uma tabela cuja sua PK é FK da PK de outra tabela... Não vejo outra alternativa coerente a não ser herança. Neste formato, desde que o banco esteja bem modelado, digo, seria até um desafio encontrar uma situação que não represente uma herança. Se alguém souber seria legal chutar a bola pra gente!
Sinceramente, nunca vi uma situação onde a chave primária de uma tabela é uma chave estrangeira apontada para a chave primária de outra tabela, nem acho que isso seja considerado boa modelagem relacional.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 17/09/2011 12:20:36
|
AbelBueno
Virtual Machine Man
Membro desde: 04/08/2010 09:37:57
Mensagens: 543
Offline
|
MWAdriano wrote:Mas desde que ela se propõe a fazer o inverso, deveria fazer de forma mais coerente, eu acho.. Poderia ao menos dar opção no momento da importação para você interagir e indicar que no lugar de encapsular, você quer herança. Eu não vejo de outra forma. Uma tabela cuja sua PK é FK da PK de outra tabela... Não vejo outra alternativa coerente a não ser herança. Neste formato, desde que o banco esteja bem modelado, digo, seria até um desafio encontrar uma situação que não represente uma herança. Se alguém souber seria legal chutar a bola pra gente!
Muitas relacionamentos NxN não entram nesse caso?
Por exemplo: uma tabela Aluno, uma tabela Professor e a tabela Aluno_Professor de relacionamento.
Sem falar que isso ocorre em muitos casos de chave composta:
Por exemplo: tabela Pessoa, tabela Endereco, onde a pk de endereço é um sequencial + id da pessoa
Nestas situações não vejo que há herança.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 17/09/2011 15:36:53
|
MWAdriano
JavaChild
Membro desde: 06/07/2009 13:45:16
Mensagens: 119
Localização: Americana-SP
Offline
|
AbelBueno wrote:
MWAdriano wrote:Mas desde que ela se propõe a fazer o inverso, deveria fazer de forma mais coerente, eu acho.. Poderia ao menos dar opção no momento da importação para você interagir e indicar que no lugar de encapsular, você quer herança. Eu não vejo de outra forma. Uma tabela cuja sua PK é FK da PK de outra tabela... Não vejo outra alternativa coerente a não ser herança. Neste formato, desde que o banco esteja bem modelado, digo, seria até um desafio encontrar uma situação que não represente uma herança. Se alguém souber seria legal chutar a bola pra gente!
Muitas relacionamentos NxN não entram nesse caso?
Por exemplo: uma tabela Aluno, uma tabela Professor e a tabela Aluno_Professor de relacionamento.
Sem falar que isso ocorre em muitos casos de chave composta:
Por exemplo: tabela Pessoa, tabela Endereco, onde a pk de endereço é um sequencial + id da pessoa
Nestas situações não vejo que há herança.
Abel, não se trata do mesmo caso! Pense bem: Na tabela Aluno_Professor, a PK é composta por 2 (duas) colunas (AlunoId e ProfessorId). Não é a mesma chave de nenhuma das outras tabelas. No caso da tabela Aluno a PK seria composta da coluna AlunoId (uma hipotese) e no caso da tabela Professor a PK seria composta pela coluna ProfessorId.
O segundo caso que você passou, no caso de endereço, Endereço tem em como parte de sua PK a coluna PessoaId. Mas não sua PK não é a mesma da tabela Pessoa, apenas é composta por uma FK que é PK da tabela pessoa. É diferente.
A herança só é identificada quando há uma relação de chaves PK-FK-PK direta. Ambas as PKs tem que serem chaves compatíveis e uma tem que ser FK da outra. Assim, não há erro para identificar uma herança.
Que achas?
[]s.
This message was edited 1 time. Last update was at 17/09/2011 15:38:14
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 17/09/2011 15:43:15
|
MWAdriano
JavaChild
Membro desde: 06/07/2009 13:45:16
Mensagens: 119
Localização: Americana-SP
Offline
|
moscoso.dev wrote:
MWAdriano wrote:Mas desde que ela se propõe a fazer o inverso, deveria fazer de forma mais coerente, eu acho.. Poderia ao menos dar opção no momento da importação para você interagir e indicar que no lugar de encapsular, você quer herança. Eu não vejo de outra forma. Uma tabela cuja sua PK é FK da PK de outra tabela... Não vejo outra alternativa coerente a não ser herança. Neste formato, desde que o banco esteja bem modelado, digo, seria até um desafio encontrar uma situação que não represente uma herança. Se alguém souber seria legal chutar a bola pra gente!
Sinceramente, nunca vi uma situação onde a chave primária de uma tabela é uma chave estrangeira apontada para a chave primária de outra tabela, nem acho que isso seja considerado boa modelagem relacional.
E como você modelaria um caso onde você tem Funcionários, Clientes, Fornecedores e Pessoas ? Cada um teria uma PK diferente? Você acha que isso seria uma boa abordagem para representar o mundo real ?
[]s.
|
----------------------------------------------
Adriano da Silva.
Trabalho com:
Java - NetBeans 6.9 - Swing/AWT/JDBC
PostGres
Windows e Linux(iniciante). |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 17/09/2011 15:58:16
|
AbelBueno
Virtual Machine Man
Membro desde: 04/08/2010 09:37:57
Mensagens: 543
Offline
|
MWAdriano wrote:Abel, não se trata do mesmo caso! Pense bem: Na tabela Aluno_Professor, a PK é composta por 2 (duas) colunas (AlunoId e ProfessorId). Não é a mesma chave de nenhuma das outras tabelas. No caso da tabela Aluno a PK seria composta da coluna AlunoId (uma hipotese) e no caso da tabela Professor a PK seria composta pela coluna ProfessorId.
O segundo caso que você passou, no caso de endereço, Endereço tem em como parte de sua PK a coluna PessoaId. Mas não sua PK não é a mesma da tabela Pessoa, apenas é composta por uma FK que é PK da tabela pessoa. É diferente.
A herança só é identificada quando há uma relação de chaves PK-FK-PK direta. Ambas as PKs tem que serem chaves compatíveis e uma tem que ser FK da outra. Assim, não há erro para identificar uma herança.
Que achas?
[]s.
Ah, me desculpe...agora entendi o que você quis dizer.
Tem razão, nesta condição imagino que o relacionamento pode representar herança.
Porém, ainda assim, há situações onde isto pode falhar.
Já vi casos em que uma tabela é quebrada em mais de uma, para agrupar dados relacionados.
Por exemplo, uma tabela de pessoa pode ser quebrada em DadosPessoais, DadosMedicos, DadosProfissao e assim por diante...
Neste caso seria um caso de composição e não herança... (aliás...muitas vezes herança é um caso de composição)
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 17/09/2011 16:36:09
|
MWAdriano
JavaChild
Membro desde: 06/07/2009 13:45:16
Mensagens: 119
Localização: Americana-SP
Offline
|
AbelBueno wrote:
MWAdriano wrote:Abel, não se trata do mesmo caso! Pense bem: Na tabela Aluno_Professor, a PK é composta por 2 (duas) colunas (AlunoId e ProfessorId). Não é a mesma chave de nenhuma das outras tabelas. No caso da tabela Aluno a PK seria composta da coluna AlunoId (uma hipotese) e no caso da tabela Professor a PK seria composta pela coluna ProfessorId.
O segundo caso que você passou, no caso de endereço, Endereço tem em como parte de sua PK a coluna PessoaId. Mas não sua PK não é a mesma da tabela Pessoa, apenas é composta por uma FK que é PK da tabela pessoa. É diferente.
A herança só é identificada quando há uma relação de chaves PK-FK-PK direta. Ambas as PKs tem que serem chaves compatíveis e uma tem que ser FK da outra. Assim, não há erro para identificar uma herança.
Que achas?
[]s.
Ah, me desculpe...agora entendi o que você quis dizer.
Tem razão, nesta condição imagino que o relacionamento pode representar herança.
Porém, ainda assim, há situações onde isto pode falhar.
Já vi casos em que uma tabela é quebrada em mais de uma, para agrupar dados relacionados.
Por exemplo, uma tabela de pessoa pode ser quebrada em DadosPessoais, DadosMedicos, DadosProfissao e assim por diante...
Neste caso seria um caso de composição e não herança... (aliás...muitas vezes herança é um caso de composição)
Bom, eu acho que nesse caso há falta de normalização. Daí, sim, uma questão de estratégia de modelagem. Posso imaginar alguns motivos que levaria alguém a modelar assim, mas não considero o ideal, nem de longe.
Remetendo-me as aulinhas de DER e MER ainda em 94, a normalização extrema do domínio "seria" o melhor dos mundos para representar o mundo real em um modelo relacional, não fosse a limitação do hardware para conseguir tocar grandes bases em SGDBs. Mas lembrando denovo, essa limitação existia em 94, quando eu usava um 486DX 50Mhz com 8MB de RAM para tocar Windows 3.1 Será que essa limitação ainda é preocupação hoje ?? Acho que não...
[]s.
This message was edited 1 time. Last update was at 17/09/2011 16:36:50
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/09/2011 20:04:47
|
YvGa
Virtual Machine Man
Membro desde: 07/03/2007 15:58:16
Mensagens: 518
Offline
|
MWAdriano wrote:
AbelBueno wrote:
MWAdriano wrote:Abel, não se trata do mesmo caso! Pense bem: Na tabela Aluno_Professor, a PK é composta por 2 (duas) colunas (AlunoId e ProfessorId). Não é a mesma chave de nenhuma das outras tabelas. No caso da tabela Aluno a PK seria composta da coluna AlunoId (uma hipotese) e no caso da tabela Professor a PK seria composta pela coluna ProfessorId.
O segundo caso que você passou, no caso de endereço, Endereço tem em como parte de sua PK a coluna PessoaId. Mas não sua PK não é a mesma da tabela Pessoa, apenas é composta por uma FK que é PK da tabela pessoa. É diferente.
A herança só é identificada quando há uma relação de chaves PK-FK-PK direta. Ambas as PKs tem que serem chaves compatíveis e uma tem que ser FK da outra. Assim, não há erro para identificar uma herança.
Que achas?
[]s.
Ah, me desculpe...agora entendi o que você quis dizer.
Tem razão, nesta condição imagino que o relacionamento pode representar herança.
Porém, ainda assim, há situações onde isto pode falhar.
Já vi casos em que uma tabela é quebrada em mais de uma, para agrupar dados relacionados.
Por exemplo, uma tabela de pessoa pode ser quebrada em DadosPessoais, DadosMedicos, DadosProfissao e assim por diante...
Neste caso seria um caso de composição e não herança... (aliás...muitas vezes herança é um caso de composição)
Bom, eu acho que nesse caso há falta de normalização. Daí, sim, uma questão de estratégia de modelagem. Posso imaginar alguns motivos que levaria alguém a modelar assim, mas não considero o ideal, nem de longe.
Remetendo-me as aulinhas de DER e MER ainda em 94, a normalização extrema do domínio "seria" o melhor dos mundos para representar o mundo real em um modelo relacional, não fosse a limitação do hardware para conseguir tocar grandes bases em SGDBs. Mas lembrando denovo, essa limitação existia em 94, quando eu usava um 486DX 50Mhz com 8MB de RAM para tocar Windows 3.1 Será que essa limitação ainda é preocupação hoje ?? Acho que não...
[]s.
Nao vejo porque a ideia do Abel fere a normalizacao. Implementar tudo numa tabela enorme é que fere.
O caso que voce descreveu eh uma forma comum de implementacao de relacionamento um-para-um, muito mais comum do que heranca quando se trata do modelo relacional.
This message was edited 1 time. Last update was at 19/09/2011 20:05:32
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 20/09/2011 07:56:15
|
MWAdriano
JavaChild
Membro desde: 06/07/2009 13:45:16
Mensagens: 119
Localização: Americana-SP
Offline
|
YvGa wrote:
Nao vejo porque a ideia do Abel fere a normalizacao. Implementar tudo numa tabela enorme é que fere.
O caso que voce descreveu eh uma forma comum de implementacao de relacionamento um-para-um, muito mais comum do que heranca quando se trata do modelo relacional.
O que você entende por normalizar o modelo relacional? Implementar tudo em uma tabela gigante realmente não é adequado, e eu não sugeri isso em momento algum. Sugeri a a normalização do modelo relacional e isso pressupõe entender o problema e dividir em entidades diferentes, implementando-o mais próximo do mundo real. O Modelo-Entidade-Relacionamento pressupõe desenhar como as entidades se relacionam, e isso pode ser quebrado aprofundando o problema e não simplesmente quebrando uma mesma tabela em três partes. Dados pessoais, você pode ter cada dado quebrado e relacionado com a pessoa, assim como dados médicos ou profissionais, em vez de uma tabela com tudo dentro ligada a outra tabela. Quando você para para reunir muitos dados em uma tabela você está limitando a normalização. Eu sugeri justamente o contrário disso.
Muita gente reclama sobre as limitações do modelo relacional, mas acho que se a gente procurar entender melhor o que propõe, vai perceber que existe possibilidade de implementar quase tudo que se pode fazer em um modelo OO. Só dá mais trabalho por não ter ferramentas prontas, e é isso que eu estou propondo.
[]s.
|
|
|
 |
|
|
|
|