Usar id do banco como referências: Anti Pattern?  XML
Índice dos Fóruns » Arquitetura de Sistemas
Autor Mensagem
Gustavokt
JavaBaby
[Avatar]

Membro desde: 01/09/2009 11:09:41
Mensagens: 95
Offline

O problema é simples:

Tenho uma árvore de uma entidade. Ela possui uma autorreferência para indicar quem seria o seu pai.
Por comodidade, em vez de colocarem uma referência da entidade, colocaram o id de banco referente ao pai.

Vocês consideram isso um anti pattern? Queria a opinião de vocês.
maior_abandonado
JWizard
[Avatar]

Membro desde: 03/09/2007 11:30:08
Mensagens: 2694
Localização: sp
Offline

Gustavokt wrote:O problema é simples:

Tenho uma árvore de uma entidade. Ela possui uma autorreferência para indicar quem seria o seu pai.
Por comodidade, em vez de colocarem uma referência da entidade, colocaram o id de banco referente ao pai.

Vocês consideram isso um anti pattern? Queria a opinião de vocês.


dexa eu ver se eu entendi direito, você tem uma tabela X, que tem uma coluna id (por exemplo) que é a pk e um idPai que seria uma FK apontando para a pk da mesma tabela?

se for isso, eu acredito que essa seja a forma correto de você montar uma árvore, inclusive tenho mais de um caso assim em um sistema que trabalho hoje.

espero ter ajudado...

falando nisso, caso seu problema tenha sido resolvido, edite o seu primeiro post e coloque um [RESOLVIDO] no titulo do tópico.
FernandoFranzini
GUJ Master
[Avatar]

Membro desde: 24/04/2009 12:58:16
Mensagens: 1541
Offline

Gustavokt wrote:O problema é simples:

Tenho uma árvore de uma entidade. Ela possui uma autorreferência para indicar quem seria o seu pai.
Por comodidade, em vez de colocarem uma referência da entidade, colocaram o id de banco referente ao pai.

Vocês consideram isso um anti pattern? Queria a opinião de vocês.

Não!!
Isso é normal e se vc procurar vai ver que é umas das muitas formas de se contornar a deficiências da filosofia relacional.

This message was edited 1 time. Last update was at 14/09/2011 14:37:27


Fernando Franzini
[Email] [WWW]
Gustavokt
JavaBaby
[Avatar]

Membro desde: 01/09/2009 11:09:41
Mensagens: 95
Offline

Então, isso era o que eu pensava...

Um dos motivos d eu achar ruim é que essa referência depende de uma informação que foi criada no banco.

Agora, suponha que eu queira fazer um teste para comparar 2 árvores. Não gostaria de ter que depender do banco, logo eu crio ids artificiais.
Imagine que uma árvore contem mais controles que o outro. Não posso simplesmente comparar os pais pelo id. Eu sempre vou precisar da árvore para saber quem é o pai de cada entidade. E pior, precisaria das 2 árvores.

Mas uma coisa que eu não cheguei a pensar é como ficaria a comparação se eu quiser incluir a verificação do pai no equals(), provavelmente seria algo recursivo.
Se eu tivesse a referência do objeto pai (e não um id), isso seria possível. Se não, vou precisar de um "contexto" para conseguir comparar...
maior_abandonado
JWizard
[Avatar]

Membro desde: 03/09/2007 11:30:08
Mensagens: 2694
Localização: sp
Offline

Gustavokt wrote:Então, isso era o que eu pensava...

Um dos motivos d eu achar ruim é que essa referência depende de uma informação que foi criada no banco.

Agora, suponha que eu queira fazer um teste para comparar 2 árvores. Não gostaria de ter que depender do banco, logo eu crio ids artificiais.
Imagine que uma árvore contem mais controles que o outro. Não posso simplesmente comparar os pais pelo id. Eu sempre vou precisar da árvore para saber quem é o pai de cada entidade. E pior, precisaria das 2 árvores.

Mas uma coisa que eu não cheguei a pensar é como ficaria a comparação se eu quiser incluir a verificação do pai no equals(), provavelmente seria algo recursivo.
Se eu tivesse a referência do objeto pai (e não um id), isso seria possível. Se não, vou precisar de um "contexto" para conseguir comparar...


não é uma coisa sim simples com certeza, mas sim, com certeza é recursivo.

quanto a comparação de uma árvore com outra, eu imagino que você precisaria das duas árvores de qualquer forma, sim, para trabalhar com isso muito provavelmente você vai precisar de algo recursivo. No oracle você tem o connect by prior para montar a árvore por exemplo se você usar o hibernate da para ele te ajudar nesse sentido. Você tendo o idPai referenciando a propria tabela (com fk mesmo), vocÊ pode ter um objeto de si mesmo como pai e um List<"siProprio"> filhos, se você deixar esse filhos como EAGER o loading dele vai ser trazido de forma automatica, o equals poderia considerar o equals dos filhos, ou dos pais... a maior complexidade me parece ser em como se deve comparar uma árvore (qaul é a regra lógica) do que de linguagem mesmo...

espero ter ajudado...

falando nisso, caso seu problema tenha sido resolvido, edite o seu primeiro post e coloque um [RESOLVIDO] no titulo do tópico.
 
Índice dos Fóruns » Arquitetura de Sistemas
Ir para:   
Powered by JForum 2.1.8 © JForum Team