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???
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.
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.
@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).