Estrutura cabeluda

Estou com uma dificuldade de montar uma estrutura bem específica, gostaria de trocar alguma idéia, ou ver se alguem tem alguma sugestão, ou ainda algum link de como trabalhar com estruturas mais chatas.

A estrutura é o seguinte:

:arrow: Tenho grupo q permite n subgrupos.
:arrow: Um grupo possui n propriedade.
:arrow: As propriedades de um grupo são definidas pelas proprias propriedades se houver e todas as propriedades do grupos que estão acima dele (em linha direta).
:arrow: Uma propriedade possui n valores, serve para restringir os valores possíveis e estes valores mudam de acordo com o grupo. Ou seja uma propriedade de um grupo tem determinados valores, a mesma propriedade num outro grupo pode ter valores diferentes.

Agradeço qq sugestão, ajuda ou link

Eu tenho uma parada dessa funcionando… eu fiz assim:

[code]Tabela ATRIBUTO

  • id_atributo (PK)
  • nm_atributo

Tabela VALOR_ATRIBUTO

  • id_valor_atributo (PK)
  • id_atributo (FK como ATRIBUTO)
  • nm_valor_atributo

Tabela GRUPO

  • id_grupo (PK)
  • ig_grupo_pai (FK com GRUPO)
  • nm_grupo

Tabela ATRIBUTO_GRUPO

  • id_grupo (PK)
  • id_valor_attributo (PK)[/code]
    ´
    O que manipulava os atributos para cada grupo era uma classe… mas a ideia dela era:

[code]- Pega o grupo desejado

  • Inclui as propriedades em uma lista
  • Loop até achar um grupo que não tenha pai
    – Pega o grupo pai
    – Inclui as propriedades na lista, caso a mesma não exista
  • Itera o loop[/code]

Eu cheguei até esse ponto:

// grupos e subgrupos
class Grupo {
	private Set<Grupo> subGrupo;
}

// Propriedades de grupo
// Valores de uma propriedade
class Model {
	private Map<Grupo, Set<Propriedade>> propriedades;
	private Map<Propriedade, Set<Valor>> valores;
}

O problema é q alguns grupos possuem valores diferentes para a mesma propriedade.

Exemplo:
Propriedade: Cor
Grupo 1, Cor: Azul, Verde
Grupo 2, Cor: Azul, Amarelo

Provavelmente tratando Valor como ValueObject

Se eu entendi bem o seu problema, acredito que no seu modelo de classe vamos ficar com duas entidades:

  • Grupo
  • Propriedades

Com um grupo pode conter 0 ou mais outros grupos e pode conter 0 ou mais propriedades, ficamos com a classe grupo da seguinte forma:

import java.util.HashSet;
import java.util.Set;

public class Grupo {
	
	private Set grupos = new HashSet();
	private Set propriedades = new HashSet();
	

	public Set getPropriedades() {
		return propriedades;
	}

	public void setPropriedades(Set propriedades) {
		this.propriedades = propriedades;
	}

	public Set getGrupos() {
		return grupos;
	}

	public void setGrupos(Set grupos) {
		this.grupos = grupos;
	}
	
}

Já a classe Propriedade fica

import java.util.ArrayList;
import java.util.List;

public class Propriedade {
	
	private List valores = new ArrayList();

        private String nome;

       public void setNome(){
...
       }
       public String getNome(){
...
       }
	public List getValores() {
		return valores;
	}

	public void setValores(List valores) {
		this.valores = valores;
	}
}

Caso deseje acessar uma determinada propriedade pode percorrer a coleção e verificar o que retorno o nome ou usar api JXPath.