That’s a great point Samuel :-) AARON ROSENZWEIG / Chat 'n Bike <http://www.chatnbike.com/> e: aa...@chatnbike.com <mailto:aa...@chatnbike.com> t: (301) 956-2319
> On Jul 28, 2019, at 8:08 PM, Samuel Pelletier <sam...@samkar.com> wrote: > > Hi Aaron, > > The nullify of the FK when a parent is deleted can be handled with Foreign > Key Constraint in the database if the relationship is not an attribute. > > This works if you use a "real" engine that support deferred constraint > checking like Oracle, Sql Server, FrontBase or PostgreSql at least. This is > not supported in MySQL. > > ALTER TABLE "Employee" ADD CONSTRAINT > "FOREIGN_KEY_Employee_CompanyID_Company_id" FOREIGN KEY ("CompanyID") > REFERENCES "Company" ("ID") on delete set null DEFERRABLE INITIALLY DEFERRED; > > You have basically the same option as in EOF, you can have the DB react to > delete of parent with these options: > - deny (default behaviour) > - set null (set the FK to null) > - cascade (cascade te delete to children) > > The same options re allowed for update with the "on update xxx" > > Regards, > > Samuel > >> Le 28 juill. 2019 à 18:08, Aaron Rosenzweig via Webobjects-dev >> <webobjects-dev@lists.apple.com <mailto:webobjects-dev@lists.apple.com>> a >> écrit : >> >> Hi Robert, >> >> Alright it’s coming together but let’s make it concrete. Let’s make a >> complete story shall we? >> >> “Employee” table has an FK to “Company” >> >> “Company” has a conceptual “toMany” to “Employee.” You could model it, or >> not. If you model it, you could make it visible, or not (class property). >> This is the big part of the question, how to model this “convenience” >> relationship since it isn’t real, it raises questions. >> >> Given the above, we now delete a company object, what should happen? >> >> If you model the “Company.employees” to-many relationship and make it a >> class property you have a choice for the delete rule: >> >> 1) Deny - if it finds at least one employee, it refuses the delete of the >> company >> >> 2) Nullify - it goes out to find all the 5,000 employees and suddenly breaks >> their bond the company so that they are now without a job. >> >> 3) Cascade - it goes out and terminates, lethally, all 5,000 employees >> before destroying the company. >> >> I’m willing to bet, dollars to donuts, that 1/2/3 will be ignored if the >> “employees” to-many relationship is not a class property. It’s gotta be >> visible for it to do either of those things. That makes sense right? If the >> idea of making it invisible is to not take the hit for faulting in 5k >> employee objects, how could it possibly “nullify” (for example) without >> faulting them in? That’s why it would HAVE to be a class property if you >> want it to do that bookkeeping. >> >> Generally, you’d never delete a company unless you manually, through a >> clever UI, allowed the user to re-home all the employees. In this story >> line, I would not model the “Company.employees” to-many relationship at all. >> If I ever needed that info, I would fetch “Employee.fetch(ec, >> Employee.COMPANY.is >> <https://ving.apple.com/proxy?t2=dE3O0r2E9w&o=http%3A%2F%2FEmployee.COMPANY.is>(appleComputer).” >> That way I’m taking the hit only when it’s needed. I would also make a true >> FK constraint in the DB that would prevent Apple from being deleted so long >> as there was at least one employee. >> >> I realize your case is not Employee and Company… but any story that has so >> many objects that you feel bad about modeling the to-many I’d feel the same >> about. I wouldn’t want the deletion of the Company to automatically nullify >> the 5k places. That said, it appears you need this… and for that the best >> course of action would be either: >> >> A) Manually fetch the Employee’s where their company relationship is equal >> to the one you are about to delete. Nullify all their relationships to >> company. Delete the company. Save changes. This will take a while if there >> is a plethora of employees. Might need a long running task so that the app >> doesn’t timeout or block other users. >> >> B) Let SQL nullify the FK and then delete the company. This would be fast >> and use little java memory. There are various helper methods to achieve this >> but here is one: ERXEOAccesUtilities.updateRowsDescribedByQualifier() >> >> A and B could be encapsulated in a method >> “Company.takeCareOfDependentsThenDelete()” that you create on Company. >> >> >> AARON ROSENZWEIG / Chat 'n Bike >> <https://ving.apple.com/proxy?t2=dE0W8n0x5N&o=http%3A%2F%2Fwww.chatnbike.com> >> e: aa...@chatnbike.com <mailto:aa...@chatnbike.com> t: (301) 956-2319 >> >> >> >>> On Jul 28, 2019, at 4:42 PM, Robert Hanviriyapunt <robertha...@gmail.com >>> <mailto:robertha...@gmail.com>> wrote: >>> >>> Ok the root problem is that deleting records is leaving bad foreign keys. >>> >>> The reason for the problem is that I made a decision long ago that in >>> certain circumstances I would model to-one relationships with a “hidden” >>> to-many reverse relationship, hopefully to help save memory or something. >>> The “hiding” is done by turning off the “class property” on the reverse >>> to-many relationship but keep the nullify rule. Now when I delete the >>> to-one relationship destination EO, it does not nullify, leaving bad >>> foreign keys. >> >> _______________________________________________ >> Do not post admin requests to the list. They will be ignored. >> Webobjects-dev mailing list (Webobjects-dev@lists.apple.com >> <mailto:Webobjects-dev@lists.apple.com>) >> Help/Unsubscribe/Update your Subscription: >> https://lists.apple.com/mailman/options/webobjects-dev/samuel%40samkar.com >> <https://lists.apple.com/mailman/options/webobjects-dev/samuel%40samkar.com> >> >> This email sent to sam...@samkar.com >
_______________________________________________ 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: https://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com