Hi Ian,<br><br>I guess there is nothing better than trying it out :)<br><br>ELE-TESTS> (defpclass person ()<br>             ((friends :accessor friends-of :associate (person friends) :many-to-many t)))<br>#<PERSISTENT-METACLASS PERSON><br>
ELE-TESTS> (defparameter person1 (make-instance 'person))<br>PERSON1<br>ELE-TESTS> (defparameter person2 (make-instance 'person))<br>PERSON2<br>ELE-TESTS> (defparameter person3 (make-instance 'person))<br>
PERSON3<br>ELE-TESTS> (defparameter person4 (make-instance 'person))<br>PERSON4<br>ELE-TESTS> (defparameter person5 (make-instance 'person))<br>PERSON5<br>ELE-TESTS> (setf (friends-of person1) person2)<br>
#<PERSON oid:3><br>ELE-TESTS> (setf (friends-of person1) person3)<br>#<PERSON oid:4><br>ELE-TESTS> (setf (friends-of person1) person4)<br>#<PERSON oid:5><br>ELE-TESTS> (setf (friends-of person1) person5)<br>
#<PERSON oid:6><br>ELE-TESTS> (setf (friends-of person2) person3)<br>#<PERSON oid:4><br>ELE-TESTS> (friends-of person1)<br>(#<PERSON oid:3> #<PERSON oid:4> #<PERSON oid:5> #<PERSON oid:6>)<br>
ELE-TESTS> (friends-of person2)<br>(#<PERSON oid:2> #<PERSON oid:4>)<br>ELE-TESTS> (friends-of person3)<br>(#<PERSON oid:2> #<PERSON oid:3>)<br>ELE-TESTS> (friends-of person4)<br>(#<PERSON oid:2>)<br>
ELE-TESTS> (friends-of person5)<br>(#<PERSON oid:2>)<br>ELE-TESTS> (remove-association person1 'friends person2)<br>NIL<br>ELE-TESTS> (friends-of person1)<br>(#<PERSON oid:4> #<PERSON oid:5> #<PERSON oid:6>)<br>
<br>So, it does seem to behave as I suspected.<br><br>Now, I think the last few questions I have on this subject before delving further are<br><br>1) What data structure do associations use to store the list of associated objects? My little understanding of update-association-end implies that the association slot creates some sort of indexed-btree.<br>
<br>2) Are they storing a reference to the objects themselves or just the OIDs. It seems to me that it stores a reference on that "indexed-btree". However, this (setf (get-value (oid target) index) (oid instance)) in update-association-end seems to imply that it stores the key/value using the OID.<br>
<br>3) Can the list be indexed in any way or do we basically need to "manually" sort it to our liking once we retrieve the associations. If my assumptions above are correct, the associations are indexed based on OID sequence.<br>
<br>As a general question in reference to #2 above, does Elephant always use the OIDs to store references of objects? I read on the list that a while back someone (I think it was you) posted something along the lines that we shouldn't use OIDs as unique identifiers because OIDs could change. I suppose during migrations, when objects are re-created, the OIDs change. Is that correct? Do the migrations take care of updating all these OID references?<br>
<br>Now, a separate modeling question arises :) Imagine a many-to-many relationship where the relationship needs to store additional information. For example, imagine a membership club. Person1 becomes a member of Club1 on 1/1/09 and is paid thru 3/31/09. We have a class for person and a class for club, but when we store the association between the two, we would like to store the "effective-date" and the "termination-date" of the membership (association). How would you approach that?<br>
<br>Thanks again,<br>JD<br><br><div class="gmail_quote">On Wed, Jan 28, 2009 at 12:32 AM, Ian Eslick <span dir="ltr"><<a href="mailto:eslick@media.mit.edu">eslick@media.mit.edu</a>></span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
That would be correct if you added (setf (friends-of person3) person2)<br>
<br>
On Jan 27, 2009, at 5:06 PM, John wrote:<br>
<br>
> Thanks for the clear example. However, maybe the idioms are<br>
> confusing me, but many-to-many tells me that I should be able to do<br>
> something like:<br>
<div class="Ih2E3d">><br>
> (setf (friends-of person1) person2)<br>
</div>> (setf (friends-of person1) person3)<br>
> (setf (friends-of person1) person4)<br>
> (setf (friends-of person1) person5)<br>
><br>
> (setf (friends-of person2) person3)<br>
><br>
> such that:<br>
><br>
> (friends-of person1) => (person2 person3 person4 person5)<br>
> (friends-of person2) => (person1 person3)<br>
> (friends-of person3) => (person1 person2)<br>
> (friends-of person4) => person1<br>
> (friends-of person5) => person1<br>
><br>
> Would that be the expected behavior?<br>
</blockquote></div><br>