A user is allowed to inherit data from parent datasets into the user's own child
dataset. The parent datasets can further inherit data from each other, so that
the user can inherit data from a parent dataset, which inherits the data from a
grandparent dataset. Such inheritance may be on a record level or on a dataset
level, or a combination of the two. For example, a child dataset may inherit a
data record from a parent dataset, which inherited that data record from a grandparent
dataset on a dataset level, along with all the other records of the grandparent
dataset. Pointers are used to keep track of data inheritances and local copies
of data may be made as necessary. For example, if a user enters a change to an
inherited data record, the child dataset may make a local copy of the data record
and enter the change into the local copy. Data may also be synchronized between
the child dataset and an alter-ego dataset. In this case, copies of data that have
been inherited into the child dataset will be sent to the alter-ego dataset on
synchronization. Changes may be made to the child dataset, the parent datasets,
or the alter-ego dataset. During subsequent synchronizations, any such changes
will undergo conflict and duplicate resolution before entering the changes into
the child dataset or propagating the changes to the alter-ego dataset.