On 04/06/2007, at 6:40 AM, Lachlan Deck wrote:

On 03/06/2007, at 10:42 PM, Andrus Adamchik wrote:

On Jun 3, 2007, at 2:44 PM, Craig L Russell wrote:

I am still entertaining the idea that we can support vertical inheritance without a designator column, and I don't think that having such column in place is such a big shortcut in implementation. After all the logic will be the same as with horizontal inheritance - sublcass criteria is an existence of a row in the subclass table).

The big win here is in performance. If you don't need the subclass values but need to know the subclass, then the discriminator allows you to instantiate the right class without a join.

I omitted performance considerations from my previous email, as I wanted to do some analysis of specific cases first. I can think of two typical cases where this may apply:

1. Inferring the object class of a target of to-one relationship to a superclass will NOT be possible just by looking at FK, unless a discriminator column is also a part of the target PK (and source FK). So no DB trip savings in resolving relationships.

2. Fetching only the base table on select should be possible, so that's probably the most obvious benefit. Originally I thought in this case users would always want to fetch the full objects, and this buys us nothing, but from the earlier emails by Lachlan, there may often be a need to iterate through just the superclass attributes. Lazy fetching of subclass table may be a better solution to that, compared to the one suggested before - instantiating superclass objects, ignoring the correct class.

Hmm. That would be nice actually and would certainly simplify any dealings with the global id. However, that may pose other problems with PostLoad(?) whereby some code that you might normally performed on PostLoad of a sub-entity may not be desired to be run when just fetching the parent. How would you discriminate between the two situations?

But taking a step back, if you're suggesting that the parent can only ever be treated as abstract then the feature request for isAbstract won't make sense anymore. It wouldn't make sense to allow a parent to be abstract but yet never actually be capable of being instantiated. For me, I think this is a problem for the individual application to work out. By having the discriminator column you've allowed the parent to be instantiated whilst maintaining the correct global id haven't you?

Let me clarify that further by saying that I don't think it's correct to allow the creation of parent entities and then later morphing them into some sub-type. I'm only thinking of allowing the instantiating of parent entities for the purposes of fetching/performance considerations.

So... considering item #2, we need to give user the flexibility to do lazy vs. eager fetch of multi-table inheritance hierarchies. Wonder if overriding "setResolvingInheritance" flag to handle this is appropriate, or we should handle it as another case of "prefetching a relationship", only this time a DbRelationship that defines the inheritance?

Yes, but my thinking on this was that the determinant for resolving inheritance would depend on isAbstract but if isAbstract was to go away, how would this work?

with regards,
--

Lachlan Deck



Reply via email to