Qual a melhor abordagem para lidar com classificações?

Olá!

Estou precisando de ajuda para decidir qual a melhor abordagem para lidar com classificações!

Por exemplo, suponhamos um sistema que eu possa criar tags dinâmicas para classificar um objeto. Tipo eu tenho um produto e eu posso criar diversas tags para esse produto, posso dizer que ele é bonito, barato, versátil… ou posso dizer que ele é um material de construção, um material de cozinha…

Além disso quero poder criar sub-tags/classificações sem fim…

Quero poder classificar em categorias principais e em sub categorias sem limite…

Também deve ser possível a criação em tempo de execução de novas categorias e subcategorias…

Penso que o enum seja uma abordagem muito bacana quando minhas categorias não são dinâmicas… Mas e quando elas são, como eu lido com isso?

Como devo configurar a parte de persistência, como ficaria com JPA e/ou Hibernate?

Se eu restringir a possibilidade de sub classificar em apenas um nível, mudaria muita coisa???

Grato pela ajuda!
PH

Uma alternativa interessante é você criar as classificações como novos tipos de forma dinâmica.

Dê uma olhada no tutorial do Esfinge AOM Role Mapper (http://esfinge.sf.net/) que ele pode te ajudar. Mesmo que não use o framework, você pode pegar a idéia da modelagem.

Uma dúvida:

Qual seria a vantagem, neste caso, de tratar essas classificações como novos tipos e não como instâncias de um mesmo tipo?

Pelo que entendi, todas teriam o mesmo comportamento (se tiverem algum).

Uma dúvida:

Qual seria a vantagem, neste caso, de tratar essas classificações como novos tipos e não como instâncias de um mesmo tipo?

Pelo que entendi, todas teriam o mesmo comportamento (se tiverem algum).[/quote]

Se as características de todos forem paiguais, você tem razão. Porém se para cada categoria as características dos produtos forem diferentes, elas podem ser os tipos dos produtos.

Fala Paulo, tudo bom?

Talvez eu partisse para algo como:


@Entity
class Classficacao{

     @OneToMany(mappedBy="classificacaoPai")
     List<Classificacao> subClassificacoes;//bidirecional

     @ManyToOne
     Classificacao classificacaoPai;//bidirecional

     @OneToMany //ou talvez um many to many
     List<Tag> tags;//cada classificacao pode ter quantas tags quiser

}

Uma dúvida sobre essas classificações: teriam realmente apenas um “pai”?

Já que o usuário poderia criar dinamicamente é possível que certas sub-categorias sejam frutos de outras duas (dependendo do ponto de vista).

Um outro fator a se considerar é que alguém terá que reconciliar essas novas classificações no final do dia.
Ou será o próprio usuário responsável por estruturar em árvores as classificações?

Se o usuário puder criar livremente essas tags, talvez seja interessante implementar algum esquema para sinônimos.

Sobre a persistência, não sei se usar um banco relacional seja a melhor saída para esse caso.
Apesar de ser totalmente possível.

Se tiver apenas um nível, você pode adotar a estrutura do Guilherme Moreira que atende bem.
Imagino que suas tags na verdade sejam exemplos de classificação.

Para mais níveis, você deve considerar se seu banco possui suporte a queries hierárquicas ou recursivas (Postgresql, Oracle e Sql Server eu sei que possuem).

Para uma solução independente de banco dá uma pesquisa sobre Nested Set e Path Enumeration.

Acho que essa última é a que representa o melhor custo benefício entre simplicidade e performance.
(Apesar de parecer gambiarra).

Obrigado senhores, vou avaliar qual será a melhor solução para o meu caso!