On 2011-11-17, at 8:09 PM, David Avendasora wrote:
> On Nov 18, 2011, at 2:10 AM, Chuck Hill wrote:
> On 2011-11-16, at 8:24 PM, David Avendasora wrote:
>>> On Nov 17, 2011, at 7:48 AM, Paul Hoadley wrote:
>>> On 17/11/2011, at 10:08 AM, David Avendasora wrote:
>>>>> On Nov 10, 2011, at 5:34 AM, Paul Hoadley wrote:
>>>>> 
>>>>>> Say I have two entities, User and Role, and a joining entity UserRole to 
>>>>>> create a many-to-many relationship between them.  So I have a 
>>>>>> relationship 'userRoles' from User to UserRole (and a relationship 
>>>>>> 'userRoles' from Role back to UserRole).  I flatten the relationship on 
>>>>>> User, so I also have a 'roles' relationship on that entity.
>>>>> 
>>>>> Wait. "Also"?!? That's insane. That's two distinct relationships 
>>>>> representing the same DB information, and one is hiding a huge piece of 
>>>>> the action. You are just asking for trouble.
>>>> 
>>>> User.userRoles is not a class property.  All that's exposed is the 
>>>> flattened User.roles.
>>> 
>>> Okay, then that should be alright then, and I think nullify is the proper 
>>> setting for the non-class "real" relationships.
>>> 
>>>> I don't _think_ I'm talking about anything particularly unusual here, just 
>>>> the standard result of creating a many-to-many relationship with Entity 
>>>> Modeler, with a join entity and "Flatten relationships" checked.
>>> 
>>> Not unusual, just something that you really shouldn't even be thinking 
>>> about. That's what flattened relationships do to you. I don't like them. 
>>> Every time I've tried to use them, I end up regretting it. I find it much 
>>> better to leave the real relationship and write cover methods that 
>>> approximate what flattening it would have done. That many-to-many join 
>>> entity always seems to end up having additional parameters, or be just the 
>>> right place to put a certain piece of business logic. Then I have to 
>>> refactor everything that was dependent upon the flattened relationship.
>> 
>> I have very rarely had that need to change a to-many relationship.  In my 
>> experience, they are just an implementation artifact from having to use an 
>> RDBMS to store an object graph.  Flattening and hiding the join table avoids 
>> adding artificial constructs to the Java code.  A Good Thing (tm) IMO.   Now 
>> if the join table is a real object in your system, then by all means don't 
>> flatten.  
> 
> Huh. I guess our experiences with many-to-many relationships is just 
> different. Every (seriously, every!) time I've said "I'll never need more 
> attributes on, or relationships from or to this many-to-many join entity, I 
> discover some requirement that mandates it.

Maybe the difference is that I never think about join entities until I need one 
in my model to keep the database happy.  I just think about object 
relationships and if it is a simple aggregate, then I use a to-many.  If the 
relationship is ordered or stageful, or whatever, that needs to be modelled in 
an object and a join table does not enter into it.


> I have to disagree that because the join table is an implementation artifact 
> that it can be ignored.

I am not saying that it can be, I am saying that it should be.  :-)


> I often times thinl that a well conceived model gives the same level of 
> importance to relationships between entities as the entities themselves.

But the EOModel is not the true object model.  It is a mapping of the true 
object model to a bastardized, partially relational version.  So the 
relationship that is actually important is the flattened one.  The one that 
references the join table is just noise.



> How long have these objects been related? Is it an active relationship? What 
> type of relationship is it? Will it stop being active?

None of which are about aggregation.


> There's a lot of meta data surrounding a relationship and a join table is the 
> perfect place to carry it.

No. No.  No.  That is not a join table, that is an intermediate object.  They 
are not the same.  One is an artifact of the relational model, the other is a 
an object in your graph.


> Maybe that information isn't needed now, but what about later? Do you trust 
> that the next developer isn't going to just add some attributes or additional 
> relationships and leave the compound-PK in place? I don't trust the next dev. 
> Why give them the opportunity to go wrong?

If they are that bad, they probably don't even need this as a starting place.  
You can't use code to prevent stupidity.


> The real dangerous situation isn't even the obvious (to me) problem with 
> compound PKs themselves. It is when you discover that your "Whatzawhozit" 
> entity needs a to-one relationship to the "UserRole". Whatzawhozit is now is 
> required to have a compound-FK. That's fine too. No big deal. It properly 
> expresses the relationship of two entities and, as you always say, "FKs are 
> just implementation artifacts of a RDBMS." Ignore them. Let EOF worry about 
> them. Your job as a WO developer is to worry about EOs!
> 
> Then one day a new WO dev comes along and says "Well, gee golly! I have the 
> FK for both User and Role! I'll just create two to-one relationships directly 
> to User and Role. Why mess with going through UserRole to get them? That's 
> just DB overhead I don't need to do! I am an optimization genius!"
> 
> And so begins the mouldering of your model.

Read that three times, still did not understand.  er, what?


> A few days/weeks/months/years later a new requirement comes up "Oh hey, 
> Whatzawhozit also needs a relationship to the many-to-many "UserDepartment" 
> entity. Okay, it already knows the userID so I can use that as half of this 
> compound-FK too. Look at how smart I am to keep my DB so nicely normalized! 
> No duplicate data!"
> 
> Pretty soon the Whatzawhozit userID attribute (hopefully it's not a class 
> property, but userID is such a useful real-world number … I digress) is 
> participating in 3 different FKs and the database is well and truly fucked, 
> only nobody knows it yet because it's very likely that not _every_ 
> transaction corrupts the database. 

And this did not help, at all.


> Maybe users will get some weird validation errors on things they weren't even 
> trying to change, but that can be entirely dependent upon your delete rules, 
> ownership settings and the non-deterministic sequence in which EOF executes 
> updates! 
> 
> If your really, really lucky, your DB might save your ass by throwing a FK 
> constraint violation, but that's assuming 2 things: 
>       1) The bad data being written is actually violates a FK constraint
>       2) You haven't disabled your non-deferrable FK-Constraints in your 
> pathetic excuse for a database.
> 
> But most likely days or weeks later you'll start getting users complaining 
> that the User or UserRole or UserDepartment is wrong for a given Whatzahozit 
> and they swear they didn't change it, or EOF starts throwing 
> NoSuchElementExceptions.
> 
> All of this could have been actively prevented by the original developer if 
> he/she had just used a True Primary Key™ in the first place.
> 
> Yes, I'm saying to do more work now to prevent potential obscure, hard to 
> diagnose bugs in the future.

Not really clear on what you describing, but join tables and compound primary 
keys don't seem to be root cause.  :-)


Chuck


> 
>>> That and flattening mandates that you use compound primary keys, which are 
>>> Evil.
>> 
>> I will argue that they are not evil if they consist only of immutable FKs.  
>> Otherwise, yes, avoid them unless you have a really good reason not to.  And 
>> even then they must be immutable.
>> 
>> 
>>> Evil like Vertical Inheritance and running without containment on your 
>>> reactor … er … I mean without FK constraints defined in the database (yes, 
>>> that was aimed at all you MySQL/MSSQL Reavers out there). All these 
>>> technologies/features reside in the Eighth Circle of Hell (8th trench, to 
>>> be specific.). They seem to be great time/money savers, but in the end they 
>>> bind you to servicing their restrictive shortcomings and tempt you into 
>>> further wobauchery like compound Foreign Keys and sharing individual 
>>> attributes of compound Foreign Keys between multiple relationships. It's 
>>> just sick what some people will do.
>> 
>> That sounds like The Voice of Experience.  :-P
> 
> Yes, yes it is. That's why I'm so pertinacious  about it now. I've learned by 
> both making the mistake myself and being stuck with a system that made it all 
> over the place. 
> 
>>> I firmly believe that the only time you should use any of them is when you 
>>> are given a legacy database that you have to write an app for. If you are 
>>> creating the db to support your own App, don't be tempted by their siren 
>>> call.
>>> 
>>> I know that it's not a popular view, and likely Chuck or Mike or many 
>>> others with greater experience will say that they can be used safely.
>> 
>> Yes, they can.  And should be.
> 
> They just are worth the long-term inflexibility and danger if abused. There 
> are few things in EOF that I'm aware of that if misused have the potential to 
> do so much subtle and hard to diagnose damage as compound-PKs. And they are 
> soooo easy to misuse.
> 
>>> They'll say things like "Flattened Many-to-Many Relationships don't kill 
>>> apps, Developers kill apps."
>> 
>> "Flattened Many-to-Many Relationships don't kill apps, Davids kill apps."
> 
> Can't argue with that as far as this David goes, but you might be casting too 
> wide a net there… :-)
> 
>>> Flattened Many-toManys just make it so much easier.
>> 
>> ... to write WO applications, yes.
> 
> Yep! And quick and easy is the name of the game.
> 
> Oh wait. No … that's Ruby on Rails. :-P
> 
> Dave

-- 
Chuck Hill             Senior Consultant / VP Development

Practical WebObjects - for developers who want to increase their overall 
knowledge of WebObjects or who are trying to solve specific problems.    
http://www.global-village.net/products/practical_webobjects







Attachment: smime.p7s
Description: S/MIME cryptographic signature

 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      (Webobjects-dev@lists.apple.com)
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to