On May 31, 2010, at 9:11 AM, Andrus Adamchik wrote:
> BTW, semantically "vertical inheritance with discriminator" is
> essentially single-table inheritance with flattened attributes in
> subclasses. Which Cayenne supports already, but without any special
> optimizations for wide|deep hierarchies.
Pounding on this idea some more ... Since we can't get away from using
entity qualifier (discriminator) at least in some cases for
performance reasons, and I hate to add multiple strategies, maybe we
do make the qualifier required and treat vertical as a special case of
single table with subclasses mapped to the same root table, and having
flattened attributes mapped to subclass-specific table. The benefits
of that are:
* No implicit inheritance relationship from super to sub table. It is
explicitly mapped inside flattened attributes.
* More intuitive mapping, easier to visualize attributes, as all
attributes are rooted in the same base table.
* Can potentially handle more than one joined table per subclass, or
the same join table for multiple subclasses, or a mix of single table
mapping with joined table mapping. I.e. in the spirit of Cayenne, we'd
allow users to follow a generic DB semantics in their mapping instead
of forcing an arbitrary ORM concepts on a (legacy) DB schema.
* No new concepts for the backend or Modeler to deal with.
Now we still need to do some work with this design:
* Make sure SELECT/INSERT/DELETE/UPDATE work correctly with flattened
attributes over 1..1 relationships, and especially when inheritance is
involved.
* Add convenience Modeler methods to flatten all attributes at once
for a given relationship to simplify subclass mapping.
* Add performance optimizations per Mike's idea, limiting the number
of joins done in a single query.
Mike, do you see any holes in this design?
Cheers,
Andrus
This archive was generated by hypermail 2.0.0 : Tue Jun 01 2010 - 13:39:16 UTC