Mapeamento OO para relacionamentos com atributos

Pessoal,

Tenho o seguinte problema. Possuo duas classes (Pessoa e Categoria). Existe um relacionamento entre elas onde uma pessoa pode ter uma Categoria. Porém preciso armazenar tbm a data e hora que a pessoa foi promovida para uma determinada categoria. Relacionalmente o que ocorre seria o seguinte:

TBL_PESSOA
ID | NOME | RG |…

TBL_CATEGORIA
ID | NOME | DESCRICAO |…

TBL_PESSOA_CATEGORIA ( Apenas para mapear o atributo do relacionamento)
ID_PESSOA | ID_CATEGORIA | DATAHORA |…

Existe algum pattern? Ou qual seria uma solução bonita para isso.

[]s,
Flavio

depende do que vc tá querendo fazer:

  • se vc pretende guardar um histórico das categorias da pessoa essa solução é a melhor e mais bonita

  • se vc só pretende armazenar uma categoria por pessoa vc deveria colocar a data na tabela de pessoa

A parte bonita é que num modelo de entidades e relacionamentos, os relacionamentos podem ter atributos, como este exemplo do Flavio.

Porém, quando "traduzimos um ExR como este para seu modelo de implementação relacional, os relacionamentos, necessariamente, serão traduzidos para:

exportar a chave primária de uma tabela para outra, como chave estrangeira, o que não permite atributos de relacionamento (sem ferir as regras de normalização - o caso da 2ª opção de seuparada);

ou, criar uma tabela que implemente o relacionamento, composta das chaves estrangeiras das tabelas relacionadas mais os atributos deste relacionamento. A chave primária desta nova tabela deverá necessariamente incluir as chaves estrangeiras, mutas vezes acrescidas de algum atributo.

Como dá para perceber, entre ExR o modelo relacional correspondente, se perde muito da beleza!!!

Quanto a padrões carimbados (design patterns), todos tem -deveriam ter- mecanismos para tais situações, mas abrir mão de entender o que de fato está ocorrendo, não contribui para uma visão clara das coisas ao nosso redor. (bonita frase, não acham?)