An implementation strategy
One strategy for implementing an in-memory EMdF database (using C++
terminology as an example) would be the following:
Have a class which encapsulates the database.
Have a class which encapsulates object types. Each object
type should encapsulate the features it has, as well as their
types. Associate each object type with an object type id and
store these in the database class.
Have a class called, e.g., CMonad_d (for "database monad").
This represents a monad_m, and has, for each object type, a list
of the object id_ds of the objects which have this monad. In
the database class, use either an array or an associative map
(e.g., std::map) which associates each monad_m with its
Have a class which encapsulates objects, their monads, and
their feature values. You can choose either to make the class
generic, capable of handling all object types, or to subclass it
for each object type in your application domain.
For each object type, use some sort of associative map (e.g.,
std::map) which maps id_ds to pointers to object objects, and
put these in the database class. You may wish to put all of the
objects in one big map, regardless of object type.
This should serve most needs.