Gerenciamento de Relacionamentos

Linguagens orientadas a objetos como Java, e relacionamentos ou associações de suporte a bancos de dados relacionais. Os relacionamentos diminuem a quantidade de armazenamento através do uso de referências de objetos ou chaves estrangeiras.

Ao usar relacionamentos em uma grade de dados, os dados deverão ser organizados em uma árvore limitada. Um tipo de raiz deve existir na árvore e todos os filhos devem estar associados a apenas uma raiz. Por exemplo: Departamento pode ter muitos Funcionários e um Funcionário pode ter muitos Projetos. Porém um Projeto não pode ter muitos Funcionários pertencentes a diferentes departamentos. Depois de uma raiz ser definida, todo o acesso a este objeto raiz e seus descendentes será gerenciado através da raiz. O WebSphere eXtreme Scale usa o código hash da chave do objeto raiz para escolher uma partição. Por exemplo:

partition = (hashCode MOD numPartitions).

Quando todos os dados para um relacionamento estiverem ligados a um única instância do objeto, toda a árvore pode ser co-localizada em uma única partição e pode ser acessada muito eficientemente usando uma transação. Se os dados englobarem múltiplos relacionamentos, então múltiplas partições devem estar envolvidas que envolvem chamadas remotas adicionais, o que pode levar a gargalos no desempenho.

Dados de Referência

Alguns relacionamentos incluem dados de consulta ou de referência como: CountryName. Para dados de consulta ou de referência, os dados devem existir em cada partição. Os dados podem ser acessados por qualquer chave raiz e o mesmo resultado é retornado. Os dados de referência como estes devem ser usados apenas nos casos em que os dados forem razoavelmente estáticas. Atualizar esses dados pode ser dispendioso porque eles precisam ser atualizados em cada partição. A API DataGrid é uma técnica comum para manter os dados de referência atualizados.

Custos e Benefícios de Normalização

A normalização dos dados usando os relacionamentos pode ajudar a reduzir a quantidade de memória usada pela grade de dados pois a duplicação dos dados é diminuída. Porém, em geral, quanto mais dados relacionais forem incluídos, menos eles irão expandir. Quando os dados são agrupados juntos, torna-se mais caro manter os relacionamentos e manter os tamanhos gerenciáveis. Como os dados das partições da grade baseiam-se na chave da raiz da árvore, o tamanho da árvore não é levado em consideração. Assim, se você tiver uma grande quantidade de relacionamentos para uma instância da árvore, a grade de dados poderá ficar desequilibrada, fazendo com que uma partição mantenha mais dados do que as outras.

Quando os dados forem não normalizados ou simplificados, os dados que normalmente seriam compartilhados entre os dois objetos são duplicados e cada tabela pode ser particionada de modo independente, oferecendo uma grade de dados muito mais equilibrada. Apesar disto aumentar a quantidade de memória usada, permite que o aplicativo escale pois uma única linha de dados pode ser acessada que pode ter todos os dados necessários. Isto é ideal para grades com maior quantidade de leituras pois a manutenção dos dados se torna mais cara.

Para obter informações adicionais, consulte Classificação de sistemas XTP e escalamento.

Gerenciamento de Relacionamentos Usando as APIs de Acesso a Dados

A API ObjectMap é a mais rápida, mais flexível e granular das APIs de acesso a dados, oferecendo uma abordagem transacional baseada em sessão no acesso aos dados na grade de mapas. A API ObjectMap permite que os clientes usem operações comuns, como create, read, update e delete (CRUD), para gerenciar pares de valores de chave de objetos na grade de dados distribuída.

Ao usar a API ObjectMap, os relacionamentos de objetos devem ser expressos pela incorporação da chave estrangeira para todos os relacionamentos no objeto-pai.

A seguir, está um exemplo.

public class Department {
	Collection<String> employeeIds;
}

A API EntityManager simplifica o gerenciamento de relacionamentos através da extração de dados persistentes a partir de objetos incluindo as chaves estrangeiras. Quando o objeto é posteriormente recuperado da grade de dados, o gráfico de relacionamentos é reconstruído, como no seguinte exemplo.

@Entity
public class Department {
	Collection<String> employees;
}

A API EntityManager é muito semelhante a outras tecnologias de persistência do objeto Java como JPA e Hibernate na qual ela sincroniza um gráfico de instâncias de objetos Java gerenciados com o armazenamento persistente. Nesse caso, o armazenamento persistente é uma grade de dados do eXtreme Scale, em que cada entidade é representada como um mapa e o mapa contém os dados da entidade em vez das instâncias do objeto.