WebSphere eXtreme Scale Product Overview > Cache concepts > Java object caching concepts
Relationship management
Object-oriented languages such as Java™, and relational databases support relationships or associations. Relationships decrease the amount of storage through the use of object references or foreign keys.
When using relationships in a grid, the data must be organized in a constrained tree. There must be one root type in the tree and all children must be associated to only one root. For example: Department can have many Employees and an Employee can have many Projects. But a Project cannot have many Employees that belong to different departments. Once a root is defined, all access to that root object and its descendants are managed through the root. WebSphere eXtreme Scale uses the hash code of the root object's key to choose a partition.
For example: partition = (hashCode MOD numPartitions).
When all of the data for a relationship is tied to a single object instance, the entire tree can be collocated in a single partition and can be accessed very efficiently using one transaction. If the data spans multiple relationships, then multiple partitions must be involved which involves additional remote calls, which can lead to performance bottlenecks.
Reference data
Some relationships include look-up or reference data such as: CountryName. This is a special case where the data should exist in every partition. Here, the data can be accessed by any root key and the same result will be returned. Reference data such as this should only be used in cases where the data is fairly static since updating it can be expensive, since it needs to be updated in every partition. The DataGrid API is a common technique to keeping reference data up-to-date.
Costs and benefits of normalization
Normalizing the data using relationships can help reduce the amount of memory used by the grid since duplication of data is decreased. However, in general, the more relational data that is added, the less it will scale out. When data is grouped together, it becomes more expensive to maintain the relationships and to keep the sizes manageable. Since the grid partitions data based on the key of the root of the tree, the size of the tree isn't taken into account. Therefore, if you have a lot of relationships for one tree instance, the grid may become unbalanced, causing one partition to hold more data than the others.
When the data is denormalized or flattened, the data that would normally be shared between two objects is instead duplicated and each table can be partitioned independently, providing a much more balanced grid. Although this increases the amount of memory used, it allows the application to scale since a single row of data can be accessed that has all of the necessary data. This is ideal for read-mostly grids since maintaining the data becomes more expensive.
For more information, see Classifying XTP systems and scaling.
Manage relationships using the data access APIs
The ObjectMap API is the fastest, most flexible and granular of the data access APIs, providing a transactional, session-based approach at accessing data in the grid of maps. The ObjectMap API allows clients to use common CRUD (create, read, update and delete) operations to manage key-value pairs of objects in the distributed grid.
When using the ObjectMap API, object relationships must be expressed by embedding the foreign key for all relationships in the parent object.
An example follows.
public class Department { Collection<String> employeeIds; }
The EntityManager API simplifies relationship management by extracting the persistent data from the objects including the foreign keys. When the object is later retrieved from the grid, the relationship graph is rebuilt, as in the following example.
@Entity public class Department { Collection<String> employees; }
The EntityManager API is very similar to other Java object persistence technologies such as JPA and Hibernate in that it synchronizes a graph of managed Java object instances with the persistent store. In this case, the persistent store is an eXtreme Scale grid, where each entity is represented as a map and the map contains the entity data rather than the object instances.
Parent topic
Java object caching concepts